PDA

Ver la Versión Completa : Como realizar multiples UPDATE desde un TStringlist


elmago00
06-12-2016, 07:48:05
Hola,
e vuelto despues de un tiempo de ausencia, al foro que me hizo crecer como programador.
les tengo una consulta.

Tengo dos tablas mysql "tipomayor" y "tipomenor" la primera tiene los primeros 4 números con que empiezan los registros de la tala menor...

Tabla mayor
1101010000
1102010000
1103010000

Tabla menor
1101010001
1101010002
1101010003
1102010001
1102010002
1102010003
1103010001
1103010002
1103010003


Lo que yo hago es extraer los primeros 6 números de todos los registros de la columna id asi:




var
guardar,guardar2:TStringlist;

begin
guardar:= TStringlist.Create;
guardar2:= TStringlist.Create;


ZQUERY1.Close;
ZQUERY1.SQL.Clear;
ZQuery1.SQL.Add('SELECT id from tipomayor') ;
Try
ZQuery1.Open;
while not ZQuery1.Eof do
begin

guardar.Add(copy(ZQuery1.Fields[0].AsString,0,6));




ZQuery1.Next;

end;
ComboBox1.Items:=guardar;



except
ComboBox1.Items:=guardar;

End;
ZQuery1.Close;






Y me da todos los registros, con sus respectivos 6 numeros iniciales..
para actualizar sus valores de acuerdo a sus primeros 6 numeros, que los reconoce como hijos, yo lo hago asi..




ZQUERY1.SQL.ADD('UPDATE tablamayor Set SALDO='2561150.25' where id='1101010000');



para saber cuales son sus hijos yo uso la esto



id regexp '+char(39)+'^'+1101+char(39));



pero debo hacerlo de de la suma de los valores de sus ·hijos",..
puedo hacer uno por uno,pero debo hacerlo automático.
actualizar todos los registros mayores, de acuerdo a los valores de sus hijos, de forma secuencial, uno tras otro.
para no tener que digitar manualmente la cuenta mayor a la que le sumare los valores de sus hijos..

gracias de antemano.

ecfisa
06-12-2016, 09:38:23
Hola.

....
Lo que yo hago es extraer los primeros 6 números de todos los registros de la columna id asi:

Podrías simplemente hacer:

...
begin
ComboBox1.Items.Clear;
ZQuery1.Close;
ZQuery1.SQL.Text := 'SELECT SUBSTRING(ID FROM 1 FOR 6) AS DATO FROM TIPOMAYOR';
ZQuery1.Open;
while not ZQuery1.Eof do
begin
ComboBox1.Items.Add( ZQuery1.FieldByName( 'DATO' ).AsString );
ZQuery1.Next;
end;
ZQuery1.Close;
...



para actualizar sus valores de acuerdo a sus primeros 6 numeros, que los reconoce como hijos, yo lo hago asi..
ZQUERY1.SQL.ADD('UPDATE tablamayor Set SALDO='2561150.25' where id='1101010000');

Sería mejor así:

begin
ZQuery1.Close;
ZQuery1.SQL.Text := 'UPDATE TABLAMAYOR SET SALDO = :SALDO WHERE ID = :ID';
ZQuery1.ParamByName('SALDO').AsCurrency := valor_saldo;
ZQuery1.ParamByName('ID').AsString := valor_id;
ZQuery1.ExecSQL;
...



...
para saber cuales son sus hijos yo uso la esto

id regexp '+char(39)+'^'+1101+char(39));
pero debo hacerlo de de la suma de los valores de sus ·hijos",..
puedo hacer uno por uno,pero debo hacerlo automático.
actualizar todos los registros mayores, de acuerdo a los valores de sus hijos, de forma secuencial, uno tras otro.
para no tener que digitar manualmente la cuenta mayor a la que le sumare los valores de sus hijos..

Aqui ya no entiendo el planteo del problema.

La otra duda que me queda es el papel que juega en todo esto TIPOMENOR (o TABLAMENOR ? ) , ya que no aparece en ninguna parte del código.

Saludos :)

elmago00
06-12-2016, 17:40:57
gracias por responer ecfisa.

yo tengo esto:

tabla mayor
id Nombre valor..
11010000 ingresos por alquiler 0.00
11020000 gasto de ventas 0.00

tabla menor
id nombre saldo
11010001 alquiler de terreno 45154.15
11010002 alquiler de oficina 8951.15
11010003 sucursal uno 0.00
11020001 impuesto sobre la renta 1450.15
11020002 otros costos 751.15




lo que debo hacer es sumar, la columna de la tabla menor, cuyos primeros 6 números sean iguales al registro de la tabla mayor.
y guardarlo en ese registro de la tabla mayor..


yo lo hago uno por uno...
pero debo hacerlo, sin tener que digitar a que cuenta mayor voy a actualizar sus valores... sino que busque los datos en la tabla menor y me actualice todos los registros de la mayor de acuerdo a la suma de la columna de la tabla menor.. automáticamente.. todo esto desde delphi

elmago00
06-12-2016, 17:57:38
recuerden yo guardo los primeros 6 numeros de cada registro de la tabla mayor en un stringlist..
como hago, para que recorra todos los valores del stringlist en la sentencia mysql... para que actualice toda la tabla mayor de forma automática.
siempre de acuerdo a los valores iniciales, que estan en la tabla menor... desde delphi

ecfisa
06-12-2016, 18:57:13
Hola.

Entonces, y si te he entendido bién, la solución se puede reducir a este código:

...
begin
ZQuery1.Close;
ZQuery1.SQL.Clear;
ZQuery1.SQL.Add('UPDATE TABLA_MAYOR MA');
ZQuery1.SQL.Add('SET MA.VALOR = COALESCE( ( SELECT SUM( ME.VALOR )');
ZQuery1.SQL.Add('FROM TABLA_MENOR ME ');
ZQuery1.SQL.Add('WHERE SUBSTRING(ME.ID FROM 1 FOR 6) = SUBSTRING(MA.ID FROM 1 FOR 6) ), 0)');
ZQuery1.ExecSQL;
end;


Saludos :)

elmago00
06-12-2016, 20:09:03
gracias funciona perfecto....