TheCrazy17 Posted November 26, 2014 Share Posted November 26, 2014 Hola a todos Estoy aprendiendo a usar SQL para hacer un sistema de guardado para unas tiendas de campaña, estuve mirando un poco de esto en otros scripts y en el foro y logre esto: addEventHandler("onResourceStart",getResourceRootElement(),function() --Conectar a la base de datos tiendasDB = dbConnect("sqlite",":/Tiendas.db") --Si no se puede conectar, cancelar if not tiendasDB then outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") cancelEvent() return else outputDebugString("[TIENDAS] Sistema iniciado correctamente.") end --Crea la tabla de tiendas en la base de datos si no existe dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") end,false) function armarTienda(source) setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) local source = source setTimer(function() local x, y, z = getElementPosition(source) local xr, yr, zr = getElementRotation(source) px, py, pz = getElementPosition(source) prot = getPedRotation(source) local offsetRot = math.rad(prot + 90) local vx = px + 5 * math.cos(offsetRot) local vy = py + 5 * math.sin(offsetRot) local vz = pz + 2 local vrot = prot + 180 tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) setObjectScale(tent, 1.3) tentCol = createColSphere(x, y, z, 4) attachElements(tentCol, tent, 0, 0, 0) setElementData(tentCol, "parent", tent) setElementData(tent, "parent", tentCol) setElementData(tentCol, "tent", true) setElementData(tentCol, "vehicle", true) setElementData(tentCol, "MAX_Slots", 100) vz = z - 1 nombre = getPlayerName(source) dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES ( "..nombre..", "..vx..", "..vy..", "..vz..", "..vrot..")") outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug end, 1500, 1) end addCommandHandler("tienda", armarTienda) Me pareció que estaba todo bien, pero me sale este error: Alguien podría darme una manito? La verdad es que no entiendo mucho de esto y quiero aprender Gracias de antemano Link to comment
MTA Team 0xCiBeR Posted November 26, 2014 MTA Team Share Posted November 26, 2014 Eso es por que estas intentando insertar un string sin especificarlo. Cambia a esto: addEventHandler("onResourceStart",getResourceRootElement(),function() --Conectar a la base de datos tiendasDB = dbConnect("sqlite",":/Tiendas.db") --Si no se puede conectar, cancelar if not tiendasDB then outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") cancelEvent() return else outputDebugString("[TIENDAS] Sistema iniciado correctamente.") end --Crea la tabla de tiendas en la base de datos si no existe dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") end,false) function armarTienda(source) setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) local source = source setTimer(function() local x, y, z = getElementPosition(source) local xr, yr, zr = getElementRotation(source) px, py, pz = getElementPosition(source) prot = getPedRotation(source) local offsetRot = math.rad(prot + 90) local vx = px + 5 * math.cos(offsetRot) local vy = py + 5 * math.sin(offsetRot) local vz = pz + 2 local vrot = prot + 180 tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) setObjectScale(tent, 1.3) tentCol = createColSphere(x, y, z, 4) attachElements(tentCol, tent, 0, 0, 0) setElementData(tentCol, "parent", tent) setElementData(tent, "parent", tentCol) setElementData(tentCol, "tent", true) setElementData(tentCol, "vehicle", true) setElementData(tentCol, "MAX_Slots", 100) vz = z - 1 nombre = getPlayerName(source) dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES ( '"..nombre.."', "..vx..", "..vy..", "..vz..", "..vrot..")") outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug end, 1500, 1) end addCommandHandler("tienda", armarTienda) PD: No te recomiendo insertar tus valores a esa Query de esa forma, mejor utiliza columna=(?) nombre = "'"..getPlayerName(source).."'" dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES (?, ?, ?, ?, ?)",nombre,vx,vy,vz,vrot) Link to comment
TheCrazy17 Posted November 26, 2014 Author Share Posted November 26, 2014 Eso es por que estas intentando insertar un string sin especificarlo.Cambia a esto: addEventHandler("onResourceStart",getResourceRootElement(),function() --Conectar a la base de datos tiendasDB = dbConnect("sqlite",":/Tiendas.db") --Si no se puede conectar, cancelar if not tiendasDB then outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") cancelEvent() return else outputDebugString("[TIENDAS] Sistema iniciado correctamente.") end --Crea la tabla de tiendas en la base de datos si no existe dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") end,false) function armarTienda(source) setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) local source = source setTimer(function() local x, y, z = getElementPosition(source) local xr, yr, zr = getElementRotation(source) px, py, pz = getElementPosition(source) prot = getPedRotation(source) local offsetRot = math.rad(prot + 90) local vx = px + 5 * math.cos(offsetRot) local vy = py + 5 * math.sin(offsetRot) local vz = pz + 2 local vrot = prot + 180 tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) setObjectScale(tent, 1.3) tentCol = createColSphere(x, y, z, 4) attachElements(tentCol, tent, 0, 0, 0) setElementData(tentCol, "parent", tent) setElementData(tent, "parent", tentCol) setElementData(tentCol, "tent", true) setElementData(tentCol, "vehicle", true) setElementData(tentCol, "MAX_Slots", 100) vz = z - 1 nombre = getPlayerName(source) dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES ( '"..nombre.."', "..vx..", "..vy..", "..vz..", "..vrot..")") outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug end, 1500, 1) end addCommandHandler("tienda", armarTienda) PD: No te recomiendo insertar tus valores a esa Query de esa forma, mejor utiliza columna=(?) nombre = "'"..getPlayerName(source).."'" dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES (?, ?, ?, ?, ?)",nombre,vx,vy,vz,vrot) Funciono perfecto Muchas gracias Ahora otra pregunta, como obtengo todos los datos (Dueño, PosX, PosY, PosZ y Rotacion) que se guardaron en la base de datos ? Para así que poder hacer que se restauren todas las tiendas creadas cuando el script inicie Link to comment
MTA Team 0xCiBeR Posted November 26, 2014 MTA Team Share Posted November 26, 2014 No lo probé pero deberia funcionar: function cargarTiendas() local consulta = dbQuery(tiendasDB,"SELECT * FROM Tiendas") local resultado = dbPoll( consulta, -1 ) if resultado then for _, v in ipairs(resultado)do local owner = v['Dueño'] local vX = v['PosX'] local vY = v['PosY'] local vZ = v['PosZ'] local rot = v['Rotacion'] local tent = createObject(3243, vX, vY, vZ - 1, 0, 0, rot) setObjectScale(tent, 1.3) local tentCol = createColSphere(vX, vY, vZ, 4) attachElements(tentCol, tent, 0, 0, 0) setElementData(tentCol, "parent", tent) setElementData(tent, "parent", tentCol) setElementData(tentCol, "tent", true) setElementData(tentCol, "vehicle", true) setElementData(tentCol, "MAX_Slots", 100) end end end addEventHandler("onResourceStart",getResourceRootElement (getThisResource()),cargarTiendas) Link to comment
TheCrazy17 Posted November 26, 2014 Author Share Posted November 26, 2014 No lo probé pero deberia funcionar: function cargarTiendas() local consulta = dbQuery(tiendasDB,"SELECT * FROM Tiendas") local resultado = dbPoll( consulta, -1 ) if resultado then for _, v in ipairs(resultado)do local owner = v['Dueño'] local vX = v['PosX'] local vY = v['PosY'] local vZ = v['PosZ'] local rot = v['Rotacion'] local tent = createObject(3243, vX, vY, vZ - 1, 0, 0, rot) setObjectScale(tent, 1.3) local tentCol = createColSphere(vX, vY, vZ, 4) attachElements(tentCol, tent, 0, 0, 0) setElementData(tentCol, "parent", tent) setElementData(tent, "parent", tentCol) setElementData(tentCol, "tent", true) setElementData(tentCol, "vehicle", true) setElementData(tentCol, "MAX_Slots", 100) end end end addEventHandler("onResourceStart",getResourceRootElement (getThisResource()),cargarTiendas) A la perfección De nuevo muchas gracias Link to comment
MTA Team 0xCiBeR Posted November 26, 2014 MTA Team Share Posted November 26, 2014 De nada. Link to comment
TheCrazy17 Posted November 27, 2014 Author Share Posted November 27, 2014 Para evitar hacer otro post vuelvo a preguntar aquí: Como hago para borrar una tienda en especifico de la base de datos? Hice esto para poder borrar las tiendas, pero lógicamente como no se borra de la base de datos sigue apareciendo cuando se inicia el script: Cliente function onPlayerTargetPickup(theElement) if getElementData(source,"Tienda") then setElementData(getLocalPlayer(),"currentCol",source) outputChatBox("Entraste en un colshape de tienda") end end addEventHandler("onClientColShapeHit",getRootElement(),onPlayerTargetPickup) function onPlayerTargetPickup (theElement) if theElement == getLocalPlayer() then local players = getElementsWithinColShape ( source, "player" ) if players == getLocalPlayer() then --[[return ]]end setElementData(getLocalPlayer(),"currentCol",false) end end addEventHandler("onClientColShapeLeave",getRootElement(),onPlayerTargetPickup) function borrar() local col = getElementData(getLocalPlayer(),"currentCol") if col then Objeto = getElementData(col,"parent") triggerServerEvent("removerTienda",getLocalPlayer(), Objeto, col) else outputChatBox("No estas en un colshape") --Debug end end addCommandHandler("borrar", borrar) Servidor addEventHandler("onResourceStart",getResourceRootElement(),function() --Conectar a la base de datos tiendasDB = dbConnect("sqlite",":/Tiendas.db") --Si no se puede conectar, cancelar if not tiendasDB then outputDebugString("[TIENDAS] No se puede conectar a la base de datos.") cancelEvent() return else outputDebugString("[TIENDAS] Sistema iniciado correctamente.") end --Crea la tabla de tiendas en la base de datos si no existe dbExec(tiendasDB,"CREATE TABLE IF NOT EXISTS Tiendas (Dueño TEXT, PosX INTEGER, PosY INTEGER, PosZ INTEGER, Rotacion INTEGER)") end,false) function cargarTiendas() local consulta = dbQuery(tiendasDB,"SELECT * FROM Tiendas") local resultado = dbPoll( consulta, -1 ) TiendasC = 0 if resultado then for _, v in ipairs(resultado)do local owner = v['Dueño'] local vX = v['PosX'] local vY = v['PosY'] local vZ = v['PosZ'] local rot = v['Rotacion'] local tent = createObject(3243, vX, vY, vZ - 1, 0, 0, rot) setObjectScale(tent, 1.3) local tentCol = createColSphere(vX, vY, vZ, 4) attachElements(tentCol, tent, 0, 0, 0) setElementData(tentCol, "parent", tent) setElementData(tent, "parent", tentCol) setElementData(tentCol, "Tienda", true) setElementData(tentCol, "MAX_Slots", 100) TiendasC = TiendasC + 1 end end outputChatBox(TiendasC.." tiendas restauradas") end addEventHandler("onResourceStart",getResourceRootElement (getThisResource()),cargarTiendas) function armarTienda(source) setPedAnimation(source, "BOMBER", "BOM_Plant", -1, false, false, nil, false) local source = source setTimer(function() local x, y, z = getElementPosition(source) local xr, yr, zr = getElementRotation(source) px, py, pz = getElementPosition(source) prot = getPedRotation(source) local offsetRot = math.rad(prot + 90) local vx = px + 5 * math.cos(offsetRot) local vy = py + 5 * math.sin(offsetRot) local vz = pz + 2 local vrot = prot + 180 tent = createObject(3243, vx, vy, z - 1, 0, 0, vrot) setObjectScale(tent, 1.3) tentCol = createColSphere(x, y, z, 4) attachElements(tentCol, tent, 0, 0, 0) setElementData(tentCol, "parent", tent) setElementData(tent, "parent", tentCol) setElementData(tentCol, "Tienda", true) setElementData(tentCol, "vehicle", true) setElementData(tentCol, "MAX_Slots", 100) vz = z - 1 nombre = "'"..getPlayerName(source).."'" dbExec(tiendasDB,"INSERT INTO Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES (?, ?, ?, ?, ?)",nombre,vx,vy,vz,vrot) outputChatBox("Tienda creada, Datos: X:"..x.." Y:"..y.." Z:"..z.." R:"..vrot, root, 0, 255, 0) --Debug end, 1500, 1) end addCommandHandler("tienda", armarTienda) function removeTent(Objeto, Colision) destroyElement(Objeto) destroyElement(Colision) end addEvent("removerTienda", true) addEventHandler("removerTienda", getRootElement(), removeTent) Que debo hacer o usar para borrar de la base de datos, la tienda que se destruye? Link to comment
Tomas Posted November 27, 2014 Share Posted November 27, 2014 La verdad no me manejo muy bien con esto, pero prueba así: dbExec(tiendasDB,"DELETE FROM Tiendas (Dueño, PosX, PosY, PosZ, Rotacion) VALUES (?, ?, ?, ?, ?)",nombre,vx,vy,vz,vrot) Link to comment
Sasu Posted November 27, 2014 Share Posted November 27, 2014 http://www.w3schools.com/sql/sql_delete.asp Link to comment
MTA Team 0xCiBeR Posted November 27, 2014 MTA Team Share Posted November 27, 2014 Con esto borras la tienda con el nombre 'X' de la base de datos: dbExec(tiendasDB,"DELETE FROM Tiendas WHERE Dueño=(?)",nombre) Link to comment
Recommended Posts