Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Como realizar multiples UPDATE desde un TStringlist (https://www.clubdelphi.com/foros/showthread.php?t=91219)

elmago00 06-12-2016 07:48:05

Como realizar multiples UPDATE desde un TStringlist
 
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:


Código Delphi [-]

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..


Código Delphi [-]

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

para saber cuales son sus hijos yo uso la esto

Código Delphi [-]

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.
Cita:

Empezado por elmago00 (Mensaje 511502)
....
Lo que yo hago es extraer los primeros 6 números de todos los registros de la columna id asi:

Podrías simplemente hacer:
Código Delphi [-]
...
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;
  ...

Cita:

Empezado por elmago00 (Mensaje 511502)
para actualizar sus valores de acuerdo a sus primeros 6 numeros, que los reconoce como hijos, yo lo hago asi..
Código Delphi [-]
ZQUERY1.SQL.ADD('UPDATE tablamayor Set SALDO='2561150.25' where id='1101010000');

Sería mejor así:
Código Delphi [-]
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;
...

Cita:

Empezado por elmago00 (Mensaje 511502)
...
para saber cuales son sus hijos yo uso la esto

Código Delphi [-]
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:
Código Delphi [-]
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:
Código Delphi [-]
...
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....


La franja horaria es GMT +2. Ahora son las 14:04:02.

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