Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-12-2009
Avatar de pnikkosis
pnikkosis pnikkosis is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 15
Poder: 0
pnikkosis Va por buen camino
Ok, lo tengo casi listo, tengo un problema con el SP nada mas, te cuento lo que hice:

Código SQL [-]
CREATE PROCEDURE SP_UPDATEORINSERT2(
codigo VARCHAR(20),
nombre VARCHAR(50),
precio NUMERIC(10,4),
AS BEGIN
IF (:codigo = 'T.CODIGO')
THEN UPDATE TABLANUEVA T SET
LOCAL2 = recio WHERE CODIGO = :codigo;
ELSE INSERT INTO TABLANUEVA (CODIGO,NOMBRE,LOCAL1,LOCAL2)
VALUES (:codigo,:nombre,0,recio)
END;

Ya aprendi a asignarle valores a las variables desde delphi,haciendo IBStoredProc1.Params[0...N].AsString o ParamsByName y el nombre, y despues que tengo todos asigandos hago .ExecProc me funciona el correrlo
Ahora, tengo dos problemas con ese SP: 1, no me esta tomando cuando el codigo existe, ponele que tengo el codigo 001 en la tabla y pongo como la variable :codigo 001, no corre el update sino que hace un insert y me quedan dos filas en la tabla con el codigo 001, raro.
Y el otro problema que tengo es... no se si como actualiza o que, pero hice una interfaz chica de prueba en delphi, con 3 edits le asigno valores a las variables y un boton corre el SP, pero hasta que no cierro la aplicacion la tabla parece que no se actualiza; uso el IBExpert como Database manager y desconecto la base, la vuelvo a abrir y lo que corri en el SP no aparece, pero si cierro la aplicacion de delphi, ahi se graba a la base y me aparece. Tiene algo que ver con hacer un commit? Tengo que tocar el componente IBTransaction?
Responder Con Cita
  #2  
Antiguo 04-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Poder: 18
Axel_Tech Va por buen camino
A ver, vamos por partes.
Cita:
Empezado por pnikkosis Ver Mensaje
Ya aprendi a asignarle valores a las variables desde delphi,haciendo IBStoredProc1.Params[0...N].AsString o ParamsByName y el nombre
Cierto, la forma de pasarle datos a un SP desde Delphi (o desde otro lenguaje) es por parámetros de entrada, o "inputs" como tú los has llamado antes

Cita:
Empezado por pnikkosis Ver Mensaje
Ahora, tengo dos problemas con ese SP: 1, no me esta tomando cuando el codigo existe, ponele que tengo el codigo 001 en la tabla y pongo como la variable :codigo 001, no corre el update sino que hace un insert y me quedan dos filas en la tabla con el codigo 001, raro
Seguramente tenga que ver con que no has definido clave o claves primarias en la nueva tabla. Define como tal por ejemplo el campo código.

Cita:
Empezado por pnikkosis Ver Mensaje
Y el otro problema que tengo es... no se si como actualiza o que, pero hice una interfaz chica de prueba en delphi, con 3 edits le asigno valores a las variables y un boton corre el SP, pero hasta que no cierro la aplicacion la tabla parece que no se actualiza; uso el IBExpert como Database manager y desconecto la base, la vuelvo a abrir y lo que corri en el SP no aparece, pero si cierro la aplicacion de delphi, ahi se graba a la base y me aparece. Tiene algo que ver con hacer un commit? Tengo que tocar el componente IBTransaction?
Sí, es problema de transacciones. Por lo que me cuentas hasta que no cierras el programa no hace el commit. Ya que has nombrado el IBTransaction puedes hacer que el IBStorecProc apunte a una IBTransaction y esta a su vez apunte a tu IBDatabase. Debes poner las propiedades del IBTransaction DefaultAction := TACommit y AutoStopAction := saCommit.

De todas formas sigo manteniendo en pie mi planteamiento anterior ya que ejecutarías el SP una sola vez, y tú lo vas a ejecutar por cada registro que exista. Si hay 6000 pues 6000 veces pero me reitero otra vez, todo es cuestión de probarlo y ver el rendimiento que obtienes.
__________________
No hope, no dreams, no love, my only escape is Underground
Responder Con Cita
  #3  
Antiguo 04-12-2009
Avatar de pnikkosis
pnikkosis pnikkosis is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 15
Poder: 0
pnikkosis Va por buen camino
Ahora entendí lo de los primary keys y foreing keys... me largue a usar firebird sin entender un joraca! jaja; en fin, agregue "codigo" como PK, y volvi a correr el SP asignandole valores, ahora si no existe lo inserta (igual que antes), pero cuando vuelvo a ponerle el mismo codigo e intentar correrlo me tira que no puede haber dos filas con el mismo codigo, asi que el IF no me esta resolviendo bien el THEN, deberia hacer un UPDATE pero lo saltea, estara mal la condicion de (:codigo = 'T.CODIGO')?
Porque T.CODIGO entre comillas simples no esta haciendo que eso sea como un string en vez de reconocerlo como referencia al campo de una tabla?, igualmente probé sacandole las comillas simples y cuando quiero compilar el SP me dice justo que hay un error en esa linea, column unknown... pero la columna codigo esta en esa tabla. Cuando adentro del update hago referencia a la columna PRECIO no me tira el mismo error.
-------------
el problema esta en la igualdad me parece... yo no le puedo decir a una igualdad que una variable con X valor sea igual a una columna entera, no le estoy espeficando a que CODIGO tiene que ser igual; deberia hacer un IF EXISTS pero no me reconoce el EXISTS

Última edición por pnikkosis fecha: 04-12-2009 a las 15:51:41.
Responder Con Cita
  #4  
Antiguo 04-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Poder: 18
Axel_Tech Va por buen camino
Cierto, no me había fijado antes, 'T.CODIGO' lo está interpretando como una cadena de caracteres.
No estoy seguro de que lo que pretendes con ese if se pueda hacer de esa manera, pues como bien has dicho en la última frase no puedes comparar una variable (en este caso un parámetro de entrada) con una columna entera de una tabla.
Puedes hacerlo con un EXISTS como te dije en el SP que puse más arriba:
Código SQL [-]
CREATE PROCEDURE SP_UPDATEORINSERT2(
codigo VARCHAR(20),
nombre VARCHAR(50),
precio NUMERIC(10,4),
AS 
DECLARE VARIABLE COD VARCHAR(20);   /*declaras una variable para meter el codigo de la consulta siguiente:*/
BEGIN

SELECT A.CODIGO 
FROM TABLA2 A 
WHERE NOT EXISTS (SELECT B.CODIGO FROM TABLANUEVA B WHERE B.CODIGO=A.CODIGO)
INTO :COD
Esta consulta mira si ya existe el codigo en la tabla, y entonces haces un if:
Código SQL [-]
IF :COD IS NULL THEN
      INSERT INTO TABLANUEVA.....
ELSE
      UPDATE TABLANUEVA.....

si :COD es null haces el INSERT, si no haces el UPDATE. A ver así que tal.
__________________
No hope, no dreams, no love, my only escape is Underground
Responder Con Cita
  #5  
Antiguo 05-12-2009
Avatar de pnikkosis
pnikkosis pnikkosis is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 15
Poder: 0
pnikkosis Va por buen camino
Resolvi el problema del IF; declare una variable :exists como output y antes del if hice:

Código SQL [-]
select count(*) from TABLANUEVA where CODIGO = :codigo INTO :exists;

(entonces si hay algun registro de codigo con el valor asignado a :codigo, el count me va a devolver un valor mas grande que cero)

y entonces el if lo empiezo asi: IF (:exists > 0) then uptade blabalbla else insert into.

Y funcionó. Y lo de que no comiteaba a la base tenias razon, era el IBTransactrion, lo tenia en saNone, lo cambie y despues del procedure commitea perfecto.

Asi que los dos problemas restantes estan solucionados, creo que ahora puedo ponerme a desarrollar! Te agradezco Axel por tu ayuda que fue invaluable y a los demas tambien. Aunque presiento que vas a ver muchas mas preguntas mias por el foro dando vueltas, soy asi de pesado para todo! jaja.
Responder Con Cita
  #6  
Antiguo 09-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Poder: 18
Axel_Tech Va por buen camino
Me alegro que por fin tengas todo claro
__________________
No hope, no dreams, no love, my only escape is Underground
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tomar datos del lector de código de barras jam888 OOP 4 22-03-2010 17:53:03
Tomar datos de otra aplicacion dblx API de Windows 4 23-12-2008 01:16:38
Tomar datos de excel vinagre3ro Internet 2 04-10-2006 09:59:28
Hola soy muy nueva en esto de las bases de datos y deseo imprimir tablas nuri Impresión 1 05-07-2005 19:49:31
Como mostrar los datos para luego insertarlos? judoboy OOP 8 14-05-2003 09:51:51


La franja horaria es GMT +2. Ahora son las 23:22:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi