PDA

Ver la Versión Completa : Problemas de nuevo


kcbb
01-12-2006, 15:10:30
Epa panas, tengo un problema trabajando con delphi 5, mi proveedor de BD es AS400, tengouna rutina para hacer select grandes, mas de 255 caracteres, tengo que hacerlos fraccionados, el problema es que cuando trato de usar la sentencia SQL de nuevo da un error. si alguien me puede ayudar se lo agradesco, aqui estoy poniendo el codigo y el error :


"Project cadivi_platinium.exe raised exception class EDBEngine error with message 'inknown internal operating system error.'. process stopped. use or run to continue"

y el codigo es el siguiente


if (nu_reg = 25) then
begin

prueba:= TQuery.Create(self);
with prueba do
begin
DatabaseName := 'qwert';
Close;
UnPrepare;
sql.clear;
sql.add('select s.nu_rif, s.nu_cadivi, p.tx_nombre, s.mt_soli,p.tp_pago from soli s, pimp p where s.nu_soli = p.nu_soli and nu_cadivi in ');
sql.add(' (02546025,02596282,02598001,02600040,02617583,02622689,02628792,02629732,02638452,02639729,02647063, 02647222,02648068,02658368,02667740,02699870,02727455,02727591,02740999,02754777,02759470,02794618,0 2798378,02799152,02811602)');
Prepare;
open;
end;
graba_rx;
prueba.sql.CleanupInstance;
prueba.Destroy;
end;

Espero la respuesta de un guru jejejejje

Caral
01-12-2006, 17:44:19
Hola kcbb
Creo que ayer dieron Roman y Bicho la respuesta a esto pero creo que tu problema se soluciona asi:

sql.clear;
sql.add('select s.nu_rif, s.nu_cadivi, p.tx_nombre, s.mt_soli,p.tp_pago');
sql.add(' from soli s, pimp p where s.nu_soli = p.nu_soli and nu_cadivi in ');
sql.add('(02546025,02596282,02598001,02600040,02617583,02622689,');
sql.add(' 02628792,02629,732,02638452,02639729,02647063,');
sql.add(' 02647222,02648068,02658368,02667740,02699870,');
sql.add(' 02727455,02727591,02740999,02754777,02759470,02794618,0,');
sql.add(' 2798378,02799152,02811602)');
Prepare;

Osea separando los caracteres, no se si con este otro serviria tambien:

sql.clear;
sql.add('select s.nu_rif, s.nu_cadivi, p.tx_nombre, s.mt_soli,p.tp_pago');
sql.add(' from soli s, pimp p where s.nu_soli = p.nu_soli and nu_cadivi in ');
sql.add('(02546025,02596282,02598001,02600040,02617583,02622689,'+
' 02628792,02629,732,02638452,02639729,02647063,'+
' 02647222,02648068,02658368,02667740,02699870,'+
' 02727455,02727591,02740999,02754777,02759470,02794618,0'+
' 2798378,02799152,02811602)');
Prepare;

En este ultimo los maestros te podrian dar su opinion.
Otra cosa usa las etiquetas para que el codigo se entienda mejor
Saludos

yusnerqui
01-12-2006, 18:21:49
Hola, yo personalmente lo hago así:


sql.text:='select s.nu_rif, s.nu_cadivi, p.tx_nombre, s.mt_soli,p.tp_pago'+
' from soli s, pimp p where s.nu_soli = p.nu_soli and nu_cadivi in '+
'(02546025,02596282,02598001,02600040,02617583,02622689,'+
'...';

Usando la propiedadad text lo que me evito es tener que limpiar con sql.clear antes de añadir la nueva sentencia.

No se cuan correcto esté esto, pero a mi siempre me ha dado resultado.

Saludos Yusnerqui.

Lepe
01-12-2006, 18:27:10
No se cuan correcto esté esto, pero a mi siempre me ha dado resultado.

Al asignar un valor a la propiedad Text, internamente se hace un Clear antes, así que no solo es correcto, sino que ahorras una línea de código, amén de ser más eficiente que añadir varias líneas, es una sola asignación.

Normalmente se usa el método Add para clarificar el código y quizás más por gusto que otra cosa.

Saludos

Bicho
01-12-2006, 18:33:51
Hoy no dejo de repetir lo que dice Lepe, pero es que hay que darle la razón :p
Al usar la propiedad SQl.Text, estás haciendo una asignación, con lo cual borras el contenido anterior y te quedas con el que le has asignado.
Pero personalmente siempre uso el SQL.Add, para clarificar, comodidad y costumbre.

Por otro lado, kcbb no ha comentado si le ha ido bien. Yo intuyo que los tiros no van por ahí, porque esta linea del SQL no llega a los 255 carácteres

sql.add(' (02546025,02596282,02598001,02600040,02617583,02622689,02628792,02629732,02638452,02639729,02647063,
02647222,02648068,02658368,02667740,02699870,02727455,02727591,02740999,02754777,02759470,02794618,0 2798378,02799152,02811602)');

con lo cual, creo que no es la razón del error que le dá. Por el tipo de error, me suena más a que tiene activada la opción de Stop en Delphi Exception (Menu Tools => Debugger Options => Pestaña Language Exceptions => Checkbox "Stop on delphi exceptions" hay que desmarcarlo)

Esperamos tu respuesta para saber que ha sido al final.

Saludos

kcbb
03-12-2006, 08:00:42
Di con el problema, segun lo que me imagino, y me jefe igual.
estaba migrando informacion de 3 BD diferentes a una 4ta BD, resulta que las conexiones con las otras BD me estaban consumiendo la memoria, la solucion fue crear el objeto, usarlo y destriurlo. Por si a alguien mas le sirve, gracias a las personas que respondieron a mi inquitud