Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Grabar datos desde ListView a Tabla Firebird. (https://www.clubdelphi.com/foros/showthread.php?t=94018)

Camilo 21-06-2019 05:34:19

Grabar datos desde ListView a Tabla Firebird.
 
Hola amigos un saludo especial.
En el siguiente procedimiento tengo tres dudas que por mas vueltas y consultas que he hecho definitivamente no pude.
1) marcado con verde, la pregunta es: como declaro en esa variable un valor que esta en el listview.Columns[0]. es decir necesito que la variable "repetir" corresponda a cualquier numero que esta previamente reflejado en esa columna.
2) marcado con purpura, la situación es casi la misma de la pregunta No. 1; Necesito que "si el registro esta chequeado" entonces haga la acción de grabar.
3) marcado con turquesa, vuelve y juega; el parámetro para la grabación no me da con ninguna opción estudiada (y juro que lo he hecho).

En síntesis este procedimiento busca: Grabar en una tabla llamada "registros" tres campos llamados "PROCEDIMIENTO, CODIGO_PROCEDIMIENTO, VALOR" los registros que esten chequeados de una lista contenida en unas columnas de un ListView, el numero de veces que dice una columna adicional del mismo listview.

Mil gracias por los aportes y atención.

Código Delphi [-]
procedure TForm1.GrabarClick(Sender: TObject);
var
i, j, repetir: integer;
begin
 for i := 0 to ListView.Items.Count - 1 do
  begin
    Repetir := StrToInt(ListView.Items.Item[0].SubItems[0]);
     if (ListView.Selected = nil) then
          with IBQGrabar do
            begin
               SQL.Text := 'INSERT INTO TREGISTROS'
               + '(PROCEDIMIENTO, CODIGO_PROCEDIMIENTO, VALOR)'
               + 'VALUES(:PROCEDIMIENTO, :CODIGO_PROCEDIMIENTO, :VALOR)';
               IBQGrabar .ParamByName('PROCEDIMIENTO').AsString:= ListView.Items.Item[0].SubItems[1];
               IBQGrabar .ParamByName('CODIGO_PROCEDIMIENTO').AsInteger:= ListView.Items.Item[0].SubItems[2];
               IBQGrabar .ParamByName('VALOR').AsFloat:= StrToFloatDef(ListView.Items.Item[0].SubItems[3], 0);
               For j := 1 to Repetir do
               ExecSQL;
            end;
  end;
           IBT1.CommitRetaining;
           ShowMessage('MUESTRA(S) GRABADA(S) CON EXITO');
end;

BD: Firebird

bucanero 21-06-2019 10:00:32

Hola Camilo

Sin entender muy bien el problema que planteas, si veo en tu código, que recorres cada uno de los registros del listView con la variable "i" pero luego no utilizas dicha variable para apuntar al registro y enlazas siempre al registro 0 o primer registro del listview.

Creo que ese es el problema que te esta generando, para solventarlo sustituye Item[0] en todo el código por Item[i], y con eso seguramente lo puedas solucionar

saludos

Camilo 21-06-2019 18:56:45

Bucanero mil gracias por tu respuesta ademas de oportuna muy acertada.
Con eso resolví el punto tres marcado con turquesa. Tu aporte si soluciono ese punto. Pero quedo sin poder hacer los otros dos (1, 2).
Resumiendo mi tema: en los puntos 1 y 2 siguen vivas las dudas y el punto 3 quedo superado gracias al aporte de Bucanero.
Mil gracias.

bucanero 21-06-2019 19:18:42

por lo que creo que intentas hacer es saber que registros están seleccionados en el listView, para lo cual intenta sustituyendo tu linea del punto 2

Código Delphi [-]
   if (ListView.Selected = nil) then

por esta otra

Código Delphi [-]
if ( ListView.Items[i].Selected ) then

En cuanto a lo de convertir una cadena en numero lo que tienes funciona siempre que la cadena sea realmente un numero, en caso contrario te dará un error, para evitar el error, inténtalo así:

Código Delphi [-]
   if not TryStrToInt(ListView.Items.Item[0].SubItems[0], Repetir) then
     MessageDlg('El valor no es correcto', mtError, [mbOK], 0)
   else if ( ListView.Items[i].Selected ) then begin
        with IBQGrabar do
            begin
               SQL.Text := 'INSERT INTO TREGISTROS'
               + '(PROCEDIMIENTO, CODIGO_PROCEDIMIENTO, VALOR)'
               + 'VALUES(:PROCEDIMIENTO, :CODIGO_PROCEDIMIENTO, :VALOR)';
               IBQGrabar .ParamByName('PROCEDIMIENTO').AsString:= ListView.Items.Item[0].SubItems[1];
               IBQGrabar .ParamByName('CODIGO_PROCEDIMIENTO').AsInteger:= ListView.Items.Item[0].SubItems[2];
               IBQGrabar .ParamByName('VALOR').AsFloat:= StrToFloatDef(ListView.Items.Item[0].SubItems[3], 0);
               For j := 1 to Repetir do
               ExecSQL;
            end;
   end;

Camilo 21-06-2019 19:36:32

Gracias nuevamente.
te cuento que en una primera prueba no funciono. Pero me imagino que tengo que sobre esa base hacer algunos ajustes. Claro que el codigo propuesto esta bien me corresponde es mirar y acomodar bien los subitems y demás aspectos prácticos a ver si lo puedo cuadrar.

Mil gracias y de resolverlo claro que pondré como nos quedo para alguien que siga el hilo.


La franja horaria es GMT +2. Ahora son las 02:30:43.

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