Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Grid no trae el result correcto (https://www.clubdelphi.com/foros/showthread.php?t=63983)

Paulao 11-03-2009 18:07:23

Grid no trae el result correcto
 
Mira, buenas tardes. Tengo una duda aca y no se como resolver. Tengo un Grid con todas las informaciones que necesito. Que pasa es que necesito hacer una rotina que pueda grabar en otra tabla algunos registros deste grid. Pero la regla es: Grabar hasta 10 registros y no mas. Esto estas haciendo bien. Esta regl yo llamo de ASSOCIACAO. Para yo poner todo esto en otra tabla, yo hizo uso del BookMarkList y BookMark. Pero hay un detalle, que es asi. El ultimo registro del Grid debe ser el Registro padre(hay otra regla aca que estas funcionando, que es de associacio de registros). Vamos imaginar que yo tengo el registro asi:

Cita:

1 Aguacate
2 Piña
3 Goyaba
4 Parchita
5 Guanabana
6 Platano
Bueno yo escojo Parchita,Platano,Piña y despues Aguacate(En esta ordene). Quando yo voy grabar en la otra tabla queda asi:
Cita:

1 Aguacate
2 Piña
3 Parchita
4 Platano
y deberia quedar asi
Cita:

1 Parchita
2 Platano
3 Piña
4 Aguacate
Percebi que esto viene del Bookmark, que sigue la orden del grid. Como hago para evitar esto y el resultado ser lo que quiero?
El numero que puzo antes es solo para usteds ver la orden, el no pertenence a la tabla.

Paulao 11-03-2009 20:56:32

Yo he logrado exito con uso de StringList, pero ahora necesito remover de StringList, quando yo desmarco el Grid y no puede tener mas de 11 registro.

Neftali [Germán.Estévez] 12-03-2009 10:29:39

1 Archivos Adjunto(s)
En este ejemplo puedes ver las dos formas más sencillas que hay de borrar una línea de un TStringGrid.

Código Delphi [-]
   //-----------------------------------------------------------
    // Mover el resto de filas hacia arriba
    procedure DeleteRow1(StringGrid: TStringGrid; ARow: Integer);
    var
      i: Integer;
    begin
      with StringGrid do
      begin
        // MOver una posicion hacia arriba el resto de líneas
        for i := ARow to RowCount - 2 do
          Rows[i].Assign(Rows[i + 1]);
        // Decrementar el número total de líneas
        RowCount := RowCount - 1
      end;
    end;
    //-----------------------------------------------------------

Y la otra:

Código Delphi [-]
  //-----------------------------------------------------------
    procedure DeleteRow2(StringGrid: TStringGrid; ARow: Integer);
    begin
      with THackStringGrid(StringGrid) do
        DeleteRow(ARow);
    end;
  //-----------------------------------------------------------

Un saludo.

Paulao 12-03-2009 12:21:22

Es un StringList y no StringGrid. Mi gustaria de deletar el ultimo registros o todos de una sola vez.

Paulao 12-03-2009 12:32:20

Este codigo esta dando List Index Out of Bound, pero porque?
Código Delphi [-]
for i := 0 to Pred(DBGrid1.SelectedRows.Count) do
      if i = 11 then
        lista_ocorrencia.Delete(i);

Neftali [Germán.Estévez] 12-03-2009 13:01:36

Cita:

Empezado por Paulao (Mensaje 341156)
Es un StringList y no StringGrid. Mi gustaria de deletar el ultimo registros o todos de una sola vez.

Perdón, fue un error de lectura.

Paulao 12-03-2009 13:19:56

Otra pregunta: Siempre que yo hacer un desmarque en el Grid, deberia sacar de StringList aquel registro. Como hago esto?

Neftali [Germán.Estévez] 12-03-2009 13:24:34

Hola.
Una opción es no borrar, sino eliminarlos todos y volverlos a añadir.

En cuanto al código, el problema creo que puede estar en que borras el 0, luego borras el 1 (que realmente no es el 1), sino que al borrar antes el 0, estás borrando el 2,... y así sucesivamente.

Paulao 12-03-2009 23:35:22

Yo tengo logrado exito en el codigo, pero tengo todavia una gran duda aca de como hacer. Mi StringList está llena. Pero mi Grid estan con sus registros marcados. Lo que quiero es quando yo Desmarcar el grid, que pueda sacar de StringList el registro equivalente. Esto que estas mi dejando sin pelo(no tengo muchos), pero quiero conservar lo que aun tengo. No se se fue claro.

Neftali [Germán.Estévez] 13-03-2009 10:01:38

Cita:

Empezado por Paulao (Mensaje 341294)
Yo tengo logrado exito en el codigo, pero tengo todavia una gran duda aca de como hacer. Mi StringList está llena. Pero mi Grid estan con sus registros marcados. Lo que quiero es quando yo Desmarcar el grid, que pueda sacar de StringList el registro equivalente. Esto que estas mi dejando sin pelo(no tengo muchos), pero quiero conservar lo que aun tengo. No se se fue claro.

Debes conseguir el registro que has "desmarcado" en el DBGrid, buscarlo en el TStringGrid y borrarlo.
El problema es que no hay ningun evento que "salte" cuando desmarcas un registro, así que tal vez tendrás que programar ese comportamiento combinando alguno de ratón con alguno de teclado.

Recorrer la lista de seleccionados y actualizar los existentes en el TStringGrid.

Paulao 13-03-2009 11:37:15

Un registro marcado tiene um Bookmark para el, entonces, si yo desmarco, el no mas tiene el Bookmark. O que pienso en hacer es, que hago um Loop For en mi lista(StringList) y hago una comparacion, a saber, que si mi registro que tengo en mi lista no tener en Bookmarklist, yo borro. El que pasa es que no se como hacer esto.

Paulao 13-03-2009 14:20:14

Este es mi codigo completo. No estoy conseguindo hacer funcionar. las lineas en rojo que mi gustaria de hacer el cierto. Si alguien mejorar el codigo, me quedo grato, pues acepto sugestiones.
Código Delphi [-]
procedure TfrmOcorrenciaPendente.grdOcorrenciasCellClick(Column: TColumn);
var
  i,k: integer;
  bkm: TBookmarkList;
  bkm_str: TBookmarkStr;
  procedure popula_lista;
  var
    j: integer;
  begin
    lista_ocorrencia.Add(copy(grdOcorrencias.Fields[1].AsString,1,4)+';'+
                         copy(grdOcorrencias.Fields[1].AsString,6,Length(grdOcorrencias.Fields[1].AsString))+';'+
                         grdOcorrencias.Fields[3].AsString+';'+grdOcorrencias.Fields[4].AsString+';'+
                         Copy(grdOcorrencias.Fields[4].AsString,1,3)+';'+grdOcorrencias.Fields[13].AsString);
    for j := 0 to Pred(grdOcorrencias.SelectedRows.Count) do
      if j = 11 then
        lista_ocorrencia.Delete(j);
  end;

begin
  if not Assigned(lista_ocorrencia) then
    lista_ocorrencia := TStringList.Create;
  bkm_str := qryOcorrencias.Bookmark;
  bkm     := grdOcorrencias.SelectedRows;

  if grdOcorrencias.SelectedRows.Count > 11 then
  begin
    MessageDlg('Só é permitido associar 10 ocorrências a uma ocorrência pai',mtInformation,[mbOk],0);
    associa := True;
    Exit;
  end
  else
  begin
    popula_lista;
    for i := 0 to Pred(lista_ocorrencia.Count)do
      for k := 0 to Pred(bkm.count) do
      begin
         Aca debo poner mi codigo para borrar el registro que no estas marcado 
     end;
  end
end;

Paulao 13-03-2009 17:02:54

Cambie mi codigo para este abajo:
Código Delphi [-]
procedure TfrmOcorrenciaPendente.grdOcorrenciasCellClick(Column: TColumn);
  procedure popula_lista;
  var
    contador,j: Integer;
    bkm: TBookmarkList;
  begin
    frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Open;
    bkm     := grdOcorrencias.SelectedRows;
    frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Open;
    frmAssociarOcor_Ocor_Direta.qryTem_Ocor.delete;
    //Pegar todos os itens selecionados somente - Paulo Correa - 17/02/2009
    for contador:= 0 to Pred(bkm.Count) do
    Begin
      if Contador > 11 then
      begin
        MessageDlg('Só é permitido associar 10 ocorrências a uma ocorrência pai',mtInformation,[mbOk],0);
        associa := True;
        Break;
      end;
      qryOcorrencias.BookMark := bkm[contador];

      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Append;
      qryTem_Ocor.FieldByName('TMP_ID').AsInteger := contador;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName('TMP_ANO_OCORRENCIA').AsString := copy(grdOcorrencias.Fields[1].AsString,1,4);
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName('TMP_NUM_OCORRENCIA').AsString := copy(grdOcorrencias.Fields[1].AsString,6,Length(grdOcorrencias.Fields[1].AsString));
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName('TMP_DEFEITO_FALHA').AsString := grdOcorrencias.Fields[3].AsString;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName('TMP_ALIM_PRIMARIO').AsString := grdOcorrencias.Fields[4].AsString;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName('TMP_SUBESTACAO').AsString := Copy(grdOcorrencias.Fields[4].AsString,1,3);
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.FieldByName('TMP_QTD_COMUNICACAO').AsInteger := grdOcorrencias.Fields[13].AsInteger;
      frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Post;

     // for j := 0 to Pred(frmAssociarOcor_Ocor_Direta.qryTem_Ocor.RecNo) do
       // if frmAssociarOcor_Ocor_Direta.qryTem_Ocor.Locate
    end;
  end;

begin
  if not Assigned(frmAssociarOcor_Ocor_Direta) then
    frmAssociarOcor_Ocor_Direta := TfrmAssociarOcor_Ocor_Direta.Create(Self);

  GravaItensSelecionado(grdOcorrencias);
end;

Pero que pasa es, que el esta en OnCellClick del grid. Yo hago click en uno y ok, pero quando yo hago click en otro, el carga en la tabla otra vez el que esta marcado y el nuevo, o sea, yo quedo con dos itenes iguales en mi tabla. Si escojo otro, entonces el graba nuevamente el nuevo y los demas que estan marcados(bookmark). Necesito contornar esto. Alguien puede me ayudar?

Paulao 16-03-2009 12:10:40

Una pregunta sobre el asunto: Quando yo escojo varios itenes en el Grid y despues de escojer todos, trengo que premer el boton derecho del mouse para arribar un Popup. El que pasa es que si yo no mantengo la tecla Ctrl premida, las marcaciones del grid borran. Si yo mantengo la tecla Ctrl premida y hago clique con el Derecho del mouse, el Evento OnCellClick del Grid no es llamado. Necesito llamar el Popup y sin perder las marcaciones y llamando el CellClick. Como hago esto?

Paulao 19-03-2009 14:16:52

Señores, hay como no mantener la ordenacion del grid com Bookmark o bookmarklist? Solo este y resuelve mi problema.


La franja horaria es GMT +2. Ahora son las 16:57:59.

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