Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Resultado de un Execute con DBxpress

Buenos dias, ha ver si me podeis hechar una mano.

Como en cualquier programa, se usan sentencias sql para trabajar con firebird, por ejemplo
Código Delphi [-]
function TFormBBDD.CreaTabla(tabla, sql: string): boolean;
var
  resultado: boolean;
begin
  Result := False;
  if BBDDconectadoBase = False then
    Exit;
  if ExisteTabla(tabla) = True then
    Exit;
  try
    SQLConnection.ExecuteDirect(sql);
    BBDDstringMonitor := 'BBDD-Tabla ' + tabla + ' creada';
    MonitorBBDD(BBDDstringMonitor);
    resultado := True;
  except
    on E: Exception do
    begin
      resultado := False;
      BBDDstringMonitor := 'BBDD-No se ha creado o alterado la tabla ' + tabla +
                           '. Error SQL' + #13 + #10 + E.Message;
      Application.MessageBox(PChar(BBDDstringMonitor), 'Atencion', MB_OK);
      MonitorBBDD(BBDDstringMonitor);
    end;
  end;
  Result := resultado;
end;
Cuando se genera un error en la sentencia, except me devuelve el error y tal, pero, si por ejemplo la sentencia sql es
'UPDATE CIUDADES SET ALCALDE='MALO' WHERE SUELDO>10000'
¿Como se cuantas filas se ven afectadas? parece que hay un componente TSQLDataSet.ExecSQL que devuelve el resultado sobre el numero de filas afectadas, pero no encuetro la solucion usando DBxExpres (dbxfb4d14.dll y fbclient.dll)

¿Alguna idea?

Gracias
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #2  
Antiguo 20-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Siempre puedes lanzar la sentencia equivalente para contar, antes del UPDATE (con el mismo WHERE):

Código SQL [-]
  SELECT COUNT(clave_primaria) AS CUENTOS WHERE SUELDO>10000
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Si, es un buen truco, pero a la pregunta formulada no hay respuesta, es decir dbxexpress no devuelve un resultado salvo en
Código Delphi [-]
    FormBBDD.SQLConnection.Execute(sql, nil, @DataSet);

Por preguntar ¿eh?

Pero, ¿Que pasa si la sentencia sql viene de un campo TMemo?
Vamos, lo que he hecho ha sido porner un TMemo y un boton, entonces queda
Código Delphi [-]
procedure TFormConfTablas.BotonSQLClick(Sender: TObject);
var
  sql, msg: string;
begin
  sql := MemoSQL.Text;
  try
    FormBBDD.SQLConnection.ExecuteDirect(sql)
  except
    on E: Exception do
    begin
      msg := E.Message;
      Application.MessageBox(PChar(msg), 'Atencion', MB_ICONERROR);
    end;
  end;
end;
En realidad no se que sentencia voy a escribir, esto lo hago para borrar registro "sucios", etc.
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.

Última edición por cesarsoftware fecha: 20-03-2013 a las 12:34:07.
Responder Con Cita
  #4  
Antiguo 20-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Supongo que en ese caso dependería de si el SGBD devuelve esa información y si los componentes permiten recuperarla.
Siento no poder ayudarte más.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Gracias neftali, creo que los componentes dbxpress no devuelven nada, segun lo que leido en los manuales, por eso preguntaba, sniff
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #6  
Antiguo 20-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 20
ozsWizzard Va por buen camino
Otra opción es hacerlo todo por procedimientos almacenados, y que estos procedimientos tengan un parámetro de salida con el resultado

Por dar "soluciones" que no quede :P
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #7  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Me has "pillado", y eso ¿como se hace ozswizzard?
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #8  
Antiguo 20-03-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 20
ozsWizzard Va por buen camino
La verdad es que no he pensado muy bien mi mensaje anterior, estaba en plan coña pero me imagino lo siguiente:

Los motores de bases de datos más usados y con cierta base para plantear lo que se quiere hacer (sql server, mysql, firebird, oracle, etc) sueles tener una ejecución de sentencias por variable de tipo cadena, es decir, una cosa así:
Código SQL [-]
Exec_Sql "update tabla where (condición)"

Y, seguramente, desde el propio motor debe ser relativamente fácil saber que devuelve esa ejecución.

Esa es la idea gorsso modo
__________________
La Madurez se llama...
~~~Gaia~~~

Última edición por ozsWizzard fecha: 20-03-2013 a las 14:01:19.
Responder Con Cita
  #9  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Ese es el problema, que no se como recuperar esa informacion de estado.
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #10  
Antiguo 20-03-2013
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Mira a ver si te vale este enlace, en lo que respecta a row_count

http://www.firebirdmanual.com/firebi...es-firebird/40

Puedes preparar un procedimeinto almacenado que te devuelva el nº de registros afectados.

Seguramente puedas hacerlo desde el excute script añadiendole la sentencia que devuelve el nº de registros afectados.

Un saludo

ROW_COUNT


DESCRIPCION:La variable de contexto ROW_COUNT contiene el número de filas afectadas por la declaración más reciente DML (INSERT, UPDATE, DELETE, SELECT o FETCH) en el gatillo actual, el procedimiento almacenado o bloque de ejecución.
TIPO RESULTADO: INTEGER
EJEMPLO:
update Figures set Number = 0 where id = :id; if (row_count = 0) then insert into Figures (id, Number) values (:id, 0);
FUNCIONAL EN: PSQL
AGREGADA EN: Versión Firebird 1.5
MODIFICADA EN: Versión Firebird 2.0
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #11  
Antiguo 20-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
A ver si leemos la documentación

Cita:
ROW_COUNT

Available in: PSQL
Added in: 1.5
Changed in: 2.0
Description: The ROW_COUNT context variable contains the number of rows affected by the most recent DML statement (INSERT, UPDATE, DELETE, SELECT or FETCH) in the current trigger, stored procedure or executable block.
Type: INTEGER
Example:
update Figures set Number = 0 where id = :id;
if (row_count = 0) then
insert into Figures (id, Number) values (:id, 0);
Behaviour with SELECT and FETCH:
  • After a singleton SELECT, ROW_COUNT is 1 if a data row was retrieved and 0 otherwise.
  • In a FOR SELECT loop, ROW_COUNT is incremented with every iteration (starting at 0 before the first).
  • After a FETCH from a cursor, ROW_COUNT is 1 if a data row was retrieved and 0 otherwise. Fetching more records from the same cursor does not increment ROW_COUNT beyond 1.
  • In Firebird 1.5.x, ROW_COUNT is 0 after any type of SELECT statement.
Responder Con Cita
  #12  
Antiguo 20-03-2013
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
A ver si la ponen bien para que la leamos.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #13  
Antiguo 20-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por fjcg02 Ver Mensaje
A ver si la ponen bien para que la leamos.
Saludos
No había visto tu respuesta
Responder Con Cita
  #14  
Antiguo 20-03-2013
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
PEnsaba que te referías a mi comentario, por eso he respondido.

De todas maneras, el link que pongo es a la página oficial de Firebird, de ahí que me sorprenda que no esté toda la información que tú aportas. Es importante el matiz de los valores que devuelve row_num para ver que no le vale a nuestro amigo.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #15  
Antiguo 20-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La info es de aquí.

Creo que puede usarlo mediante un "stored procedure"
Responder Con Cita
  #16  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Esto...., una cuestion a los espertos,

Cuando ejecutais una sentencia cualquiera en sql, os fiais siempre de que ha hecho lo que quereis, o teneis algun truco, quiero decir.

Si ejecuto SQLconnection.execute('SELECT * FROM CIUDADES', nil, @DataSet) en DataSet tengo el resultado de la consulta, aunque sea 0, pero
si ejectuto SQLconnection.executedirect('UPDATE CIUDADES SET ALCADE='MALO' WHEN SUELDO>10000'), ¿como sabeis que ha hecho algo o lo ha hecho bien?
yo suelo poner un try, except pero solo funciona cuando la setencia sql esta mal escrita, pero si esta bien y "no hay ningun alcalde malo" no me entero de que o no ha hecho nada o de que todos los alcaldes son malos.

Vale, si, podria hacer un count previo y otro posterior, pero, seguro que hay algo que resuelva esta cuestion

PD: LJM (Leete el Jodido Manual), ya si ya me he estudiado "parte" del manual y hasta tengo varios libros de sql, aunque, ¡os necesitooooo!
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #17  
Antiguo 20-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Porque lo hace bien, no hay duda, hace exactamente lo que se le dice.
Otra cosa distinta es que no haya hecho lo que tú esperabas, pero eso ya es fallo de uno.
Responder Con Cita
  #18  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Correcto casimiro, firebird es muy bueno, reconozco que no soy experto en sql, uso sql (bueno firebird) desde hace unos pocos años y siempre, siempre me he fiado de el y nunca me ha fallado.

Pero estaba hasta los webs de usar programas de terceros para ver el contenido de tablas, borrar registros "sucios", cambiar un valor para hacer unas pruebas, etc.
Asi que desde hace un par de proyectos incluyo un pequeño manejador de la tablas de la base de datos, donde puede añadir tablas, indices, campos, cambiar campos, etc. y ahora le he añadido ese memo para hacer cositas, tipo filtro para ver los registros pero solo de una fecha o borrar algo, etc. y es ahora cuando he visto que estaria bien si se pudiera tener ese "log" de resultado.

¿Como haceis vosotros? usais programas tipo IBQ u os lo "currais a pelo".

¿Por preguntar eh?
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #19  
Antiguo 20-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En todo caso, conectas con ibexpert o flamerobin... y listo. ¿Para qué complicarse la vida?
Responder Con Cita
  #20  
Antiguo 20-03-2013
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
No me jo... no me digas que me estoy complicando la vida usando dbxpress, era con el que empece (creo que por dephi 2005) despues de abandonar las tablas BDE y me costo encontrar la libreria para delphi 2010, porque creo, ya no me acuerdo, que en alguna version delphi se desprendio de los componentes dbxpress para atacar a interbase/firebird y me tuve que "buscar la vida" y encontrarlos "por ahi".

Si tuviera todo el tiempo del mundo...igual me leia todos los mensajes de las zonas de este foro y a lo mejor, encontraria el componente ideal, pero casi siempre es mejor usar lo que uno "domina", pero acepto sugerencia para cambiar.
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
Respuesta



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
Problema file not found dbxpress.dcu liito16 Varios 3 28-09-2012 05:18:56
Problemas con dbxpress en dll mcsebas Conexión con bases de datos 3 05-08-2010 08:33:04
Busqueda en SQL Server con dbxpress mbcito SQL 1 10-11-2005 16:42:43
problema con delphi7,firebird 1.5 y dbxpress Eskema Conexión con bases de datos 2 27-07-2005 13:22:52
donde poner los componentes dbxpress wonder boy Conexión con bases de datos 5 23-03-2004 15:25:51


La franja horaria es GMT +2. Ahora son las 18:52:39.


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