Szerző Téma: Kocsik lekérése  (Megtekintve 1659 alkalommal)

Kocsik lekérése
« Dátum: 2017. Április 17. - 15:31:24 »
0
Sziasztok!
 
A hiba ez lenne: ERROR: ... \'for\' limit must be a number
 
Pedig elvileg egy számot kéne visszakapjak.
 
A kód :


function loadVehs()
    vehIDs = exports.mysql:_QuerySingle(\"SELECT MAX(id) FROM vehicles\")
    for i=0,vehIDs,1
    do
            vehInf = exports.mysql:_QuerySingle(\"select * from vehicles where id = ?\",i)
            veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
            setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
    end    
    outputDebugString(vehIDs)
    outputDebugString(tostring(vehIDs))
end
addEventHandler(\"onResourceStart\",resourceRoot,loadVehs)

Kocsik lekérése
« Válasz #1 Dátum: 2017. Április 17. - 22:21:27 »
0
Próbáld debugoltatni a for nélkül. Ha számot kapsz vissza akkor tonumber pl.

Kocsik lekérése
« Válasz #2 Dátum: 2017. Április 17. - 22:55:37 »
0
Már probáltam de valami ilyesmit kaptaM : table : szamsorozat (Mármint valamennyi szám, de nem az ami kell) //telo

Nem elérhető id100

  • 903
    • Profil megtekintése
Kocsik lekérése
« Válasz #3 Dátum: 2017. Április 18. - 15:21:13 »
0
Az egy element.
 
E: MOST néztem hogy for limitnek kell,
 
akkor abban az esetben #-et írd a tábla elé és egy számot kapsz :D Az lesz az összes elem számosítva.
 
Tehát
 

for i=0,vehIDs,1

 
De #vehIDs kellene oda :)
« Utoljára szerkesztve: 2017. Április 18. - 15:22:32 írta id100 »

Kocsik lekérése
« Válasz #4 Dátum: 2017. Április 18. - 17:38:50 »
0
function loadVehs()
    vehIDs = exports.mysql:_QuerySingle(\"SELECT MAX(id) FROM vehicles\")
    for i=0,#vehIDs,1
    do
            vehInf = exports.mysql:_QuerySingle(\"select * from vehicles where id = ?\",i)
            veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
            setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
    end    
    outputDebugString(vehIDs)
    outputDebugString(#vehIDs)
    outputDebugString(tostring(vehIDs))
    outputDebugString(tostring(#vehIDs))
 
end
addEventHandler(\"onResourceStart\",resourceRoot,loadVehs)
 
 
 
Most így néz ki, de a vehInf-re azt írja nil.

Nem elérhető Enigma

  • 391
    • Profil megtekintése
Kocsik lekérése
« Válasz #5 Dátum: 2017. Április 18. - 18:12:51 »
0
Már magát azt nem értem hogy neked miért kell 2 queryzés ahhoz hogy betöltsd az autókat..

Kocsik lekérése
« Válasz #6 Dátum: 2017. Április 18. - 18:18:20 »
0
Mivel az egyikkel lekérem a max-ot (mennyi kocsi van) a másikkal meg a kocsi infókat.

Nem elérhető Enigma

  • 391
    • Profil megtekintése
Kocsik lekérése
« Válasz #7 Dátum: 2017. Április 18. - 18:35:47 »
0
És ehhez miért kell 2? Miért kell neked tudni a max kocsikat? Miért nem lehetne egy SELECT * FROM vehicles?

Kocsik lekérése
« Válasz #8 Dátum: 2017. Április 18. - 21:23:21 »
0
Mert ha nem tudom mennyi kocsi van akkor végtelen for-t hozzak létre? Az meg zabálna feleslegesen.

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
Kocsik lekérése
« Válasz #9 Dátum: 2017. Április 18. - 21:48:54 »
0
Milyen végtelen ciklus? :D
Inkább nézz utána, hogyan is működik maga az egész adatbázis kezelés az MTAban, meg hogyan működik az SQL :D
 
https://wiki.multitheftauto.com/wiki/DbQueryhttps://wiki.multitheftauto.com/wiki/DbPoll

Nem elérhető Enigma

  • 391
    • Profil megtekintése
Kocsik lekérése
« Válasz #10 Dátum: 2017. Április 19. - 10:43:30 »
0
Idézetet írta: DrAkE date=1492544934


   
      Inkább nézz utána, hogyan is működik maga az egész adatbázis kezelés az MTAban
   


Hát nem ártana.
 
A SELECT * mindent kiválaszt az adott táblából, és egy táblát returnöl, ami tartalmazza a kocsikat. azon már áttudsz loopolni, és létretudod hozni a kocsikat.

Kocsik lekérése
« Válasz #11 Dátum: 2017. Április 19. - 11:09:46 »
0
Ohh, kösz Engima, rájöttem hogy táblaként kéne kezelni, Oké, újraírom az egészet.
« Utoljára szerkesztve: 2017. Április 19. - 11:10:03 írta thegergo02 »

Nem elérhető Xenius

  • 668
    • Profil megtekintése
Kocsik lekérése
« Válasz #12 Dátum: 2017. Április 21. - 20:20:41 »
0

function loadOneVehicle(vehInf)
local veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
if veh then
   setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
end
end
addEventHandler(\"onResourceStart\", resourceRoot, function()
dbQuery(function(qh)
   local res, rows, err = dbPoll(qh, 0)
   if rows > 0 then
      for k, in pairs(res) do
         local co = coroutine.create(loadOneVehicle)
         coroutine.resume(co, v)
      end
   end
end, connection, \"SELECT * FROM vehicles\")
end)

 
+ Javaslom hogy a coroutine részt állítsd egy timerre, ami egyszerre max 2-3 autót tölt be. Ezres nagyságrendnél elég sok problémát tud okozni ha 2000-3000 kocsit töltesz be egyszerre.
 
Vagy pedig használj async-et, az is sokat segít. (https://github.com/Inlife/mta-lua-async)
 
Ahhoz egy példa (a for részt kell kicserélni erre):
 

Async:setPriority(\"normal\") -- engedélyezett típusok: low - lassú, kevés cpu, normal, high - gyors betöltés, sok cpu
Async:foreach(res, function(value)
loadOneVehicle(value)
end, function()
outputChatBox(\"kész\")
end)

 
 

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
Kocsik lekérése
« Válasz #13 Dátum: 2017. Április 23. - 20:13:39 »
0
Idézetet írta: Xenius date=1492798841


   

function loadOneVehicle(vehInf)
local veh = createVehicle(vehInf.vehid,vehInf.x,vehInf.y,vehInf.z,0,0,0,vehInf.backplate)
if veh then
   setVehicleColor(veh,vehInf.r1,vehInf.g1,vehInf.b1,vehInf.r2,vehInf.g2,vehInf.b2,vehInf.r3,vehInf.g3,vehInf.b3,vehInf.r4,vehInf.g4,vehInf.b4)
end
end
addEventHandler(\"onResourceStart\", resourceRoot, function()
dbQuery(function(qh)
   local res, rows, err = dbPoll(qh, 0)
   if rows > 0 then
      for k, in pairs(res) do
         local co = coroutine.create(loadOneVehicle)
         coroutine.resume(co, v)
      end
   end
end, connection, \"SELECT * FROM vehicles\")
end)

   
      + Javaslom hogy a coroutine részt állítsd egy timerre, ami egyszerre max 2-3 autót tölt be. Ezres nagyságrendnél elég sok problémát tud okozni ha 2000-3000 kocsit töltesz be egyszerre.
   
   
      Vagy pedig használj async-et, az is sokat segít. (https://github.com/Inlife/mta-lua-async)
   
   
      Ahhoz egy példa (a for részt kell kicserélni erre):
   
   

Async:setPriority(\"normal\") -- engedélyezett típusok: low - lassú, kevés cpu, normal, high - gyors betöltés, sok cpu
Async:foreach(res, function(value)
loadOneVehicle(value)
end, function()
outputChatBox(\"kész\")
end)

   
       
   


Tök felesleges ilyen dolgokért async-et, vagy akár coroutinet használni, hacsaknem minden 10 másodpercenként betöltögeted az összes kocsit adatbázisból. Alapból a dbQuery akkor hívja meg a funkciót, amikor az adatok már készen állnak.
Plusz csak megnehezíted a saját dolgodat.

Kocsik lekérése
« Válasz #14 Dátum: 2017. Április 24. - 19:51:02 »
0
Köszönöm a tanácsokat!

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal