Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-03-2021
NeWsP NeWsP is offline
Miembro
 
Registrado: oct 2003
Ubicación: Barcelona
Posts: 57
Poder: 21
NeWsP Va por buen camino
Unhappy Procedimiento correcto para usar un memtable en grid

Buenas tardes,

Estoy desarrollando una aplicación sencilla con un memtable y un query, es decir, hago una consulta a la base de datos con el query, recorro el query, y según la información me genero un memtable con toda la información que necesito para mostrarlo en un grid.

Si tengo que actualizar algún dato en la base de datos, ataco directamente a la base de datos con otro query, pero para poder actualizar los datos del grid, vuelvo a recorrer el primer query y actualizado la memtable y automáticamente el grid, pero claro, de esta forma pierdo la linea en la que estaba.

Con un LOCATE puedo volver a encontrarla, pero realmente se me desplazan las scrollbars y se nota bastante feo...

Alguna sugerencia de como poder evitar esto?

Muchas Gracias!
Responder Con Cita
  #2  
Antiguo 03-03-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Con DisableControls y EnableControls

Código Delphi [-]
miDataset.DisableControls;
try
  //Operaciones que mueven el dataset
finally
  miDataset.EnableControls;
end;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 04-03-2021
NeWsP NeWsP is offline
Miembro
 
Registrado: oct 2003
Ubicación: Barcelona
Posts: 57
Poder: 21
NeWsP Va por buen camino
Smile

Muchas gracias,

He probado y por un momento funcionaba y ahora otra vez no me funciona sin tocar nada :S

Es raro, porque si el grid esta en la parte inferior, parece que funciona bien.

Si el grid esta en otra posición, lo mueve hasta el centro de la pantalla.

Pongo el codigo que estoy utilizando: (seguro que es un desastre de codigo...)

Código Delphi [-]
procedure TTMSForm1.ActualizarPedidos(Operacion: Integer);
var
  lineasPedido: Integer;
  lineasAsignadas: Integer;
  estado: Integer;
  plazo: string;

begin

  MemPedidos.DisableControls;
  try
   TMSForm1.MemPedidos.EmptyDataSet;

    DBAdvGrid1.DataSource := nil;

    FDQuery1.SQL.Clear;
    With FDQuery1 do
    begin
      SQL.Clear;
      SQL.Add('SELECT FECPCL,CODPCL,CNOPCL FROM F_PCL WHERE ESTPCL<>2 ORDER BY CODPCL');
      open;
    end;

    TMSForm1.FDQuery1.First;
    while not TMSForm1.FDQuery1.eof do
    begin

      QueryOperaciones.SQL.Clear;
      QueryOperaciones.SQL.Add
        ('SELECT DISTINCT posicion FROM Pedidos WHERE pedido=edido');
      QueryOperaciones.ParamByName('pedido').Value :=
        FDQuery1.FieldByName('CODPCL').Value;
      QueryOperaciones.open();

      lineasAsignadas := QueryOperaciones.RecordCount;

      QueryOperaciones.SQL.Clear;
      QueryOperaciones.SQL.Add('SELECT plazo FROM plazos WHERE pedido=edido');
      QueryOperaciones.ParamByName('pedido').Value :=
        FDQuery1.FieldByName('CODPCL').Value;
      QueryOperaciones.open();

      if QueryOperaciones.RecordCount > 0 then
      begin
        plazo := QueryOperaciones.FieldByName('plazo').Value;
      end
      else
      begin
        plazo := ' --- '
      end;

      QueryFactu.SQL.Clear;
      QueryFactu.SQL.Add('SELECT POSLPC FROM F_LPC WHERE CODLPC=edido');
      QueryFactu.ParamByName('pedido').Value :=
        FDQuery1.FieldByName('CODPCL').Value;
      QueryFactu.open();

      lineasPedido := QueryFactu.RecordCount;

      if lineasPedido = lineasAsignadas then
      begin
        estado := 1;
      end;

      if (lineasPedido <> lineasAsignadas) AND (lineasAsignadas > 0) then
      begin
        estado := 2;
      end;

      if lineasAsignadas = 0 then
      begin
        estado := 0;
      end;

      with TMSForm1.MemPedidos do
      begin
        Append;
        Fields[0].AsInteger := estado;
        Fields[1].AsDateTime := TMSForm1.FDQuery1.FieldByName('FECPCL').Value;
        Fields[2].AsInteger := TMSForm1.FDQuery1.FieldByName('CODPCL').Value;
        Fields[3].AsString := TMSForm1.FDQuery1.FieldByName('CNOPCL').Value;
        Fields[4].AsString := plazo;
        Post;
      end;
      TMSForm1.FDQuery1.Next;
    end;
    DBAdvGrid1.Visible := True;

    DBAdvGrid1.DataSource := DataPedidos;

  finally
      MemPedidos.Locate('Pedido', pedidoActual, []);
      MemPedidos.EnableControls;

  end;
end;

Y así es como llamo al procedimiento, cuando he añadido un plazo nuevo:

Código Delphi [-]
if main.accion_plazo = 0 then
  begin
    FDQuery1.SQL.Clear;
    FDQuery1.SQL.Add
      ('INSERT INTO plazos (pedido,plazo,estado,año) VALUES(edido,lazo,:estado,:ano)');
    FDQuery1.ParamByName('pedido').Value := main.TMSForm1.MemPedidos.FieldByName
      ('pedido').Value;
    FDQuery1.ParamByName('plazo').Value :=
      datetostr(AdvSmoothCalendar1.SelectedDate);
    FDQuery1.ParamByName('estado').Value := 0;
      FDQuery1.ParamByName('ano').Value := AdvSmoothCalendar1.Year;
    FDQuery1.ExecSQL;
  end
  else
  begin
     FDQuery1.SQL.Clear;
    FDQuery1.SQL.Add
      ('UPDATE plazos SET plazo=lazo WHERE pedido=edido AND año=:ano');
      FDQuery1.ParamByName('plazo').Value:=  datetostr(ADVSmoothCalendar1.SelectedDate);
    FDQuery1.ParamByName('pedido').Value := main.TMSForm1.MemPedidos.FieldByName
      ('pedido').Value;
    FDQuery1.ParamByName('ano').Value := AdvSmoothCalendar1.Year;
    FDQuery1.ExecSQL;
  end;

  plazo.Form1.Close;

     main.TMSForm1.ActualizarPedidos(0);

Entonces lo que hace es que si estoy en la parte inferior del grid parece que es correcto, pero si estoy en otro sitio me centra la fila seleccionada.

Alguna sugerencia T_T?

Última edición por NeWsP fecha: 04-03-2021 a las 11:58:01. Razón: Añadir codigo, y explicación
Responder Con Cita
  #4  
Antiguo 04-03-2021
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
'Locate' funciona así. Posiciona la linea buscada en medio del grid, salvo que el número total de lineas en pantalla no se lo permita (o que sea la primera o la última). Por lo menos en las versiones de Delphi con las que he trabajado.
Responder Con Cita
  #5  
Antiguo 04-03-2021
NeWsP NeWsP is offline
Miembro
 
Registrado: oct 2003
Ubicación: Barcelona
Posts: 57
Poder: 21
NeWsP Va por buen camino
Gracias por contestar,

He probado con:

Código Delphi [-]
  MemPedidos.SetKey;
    MemPedidos.FieldByName('Pedido').Value := pedidoactual;
    MemPedidos.GotoKey;

Pero me hace lo mismo.

Alguna sugerencia para posicionarme en la fila correcta sin que se mueva? T_T
Responder Con Cita
  #6  
Antiguo 04-03-2021
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.912
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Analizando tu código no hay como eso funcione. Lo que describes NO ES lo que haces. Tu NO "actualizas la memtable".

Como quieres que "recuerde" si nuleas la referencia, la limpias del todo y luego la asignas? Totalmente estas haciendo UN NUEVO OBJETO.

Antes gracia que medio ande
__________________
El malabarista.
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
Es Correcto este Procedimiento? novato_erick SQL 4 21-11-2012 19:22:50
hay algun comando para duplicar una ficha de un memtable? cocute Conexión con bases de datos 0 19-12-2009 12:06:23
Grid no trae el result correcto Paulao Varios 14 19-03-2009 14:16:52
Usar un solo procedimiento almacendado para restar o sumar valores a un mismo registro Chogo Trucos 2 11-05-2007 17:39:01
Como usar las transacciones que es lo correcto azraelrvg Firebird e Interbase 1 21-10-2003 23:02:37


La franja horaria es GMT +2. Ahora son las 18:22:12.


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