Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como hacer consultas de registro anterior y siguiente (https://www.clubdelphi.com/foros/showthread.php?t=84407)

Jorge Orozco 15-10-2013 16:22:45

Como hacer consultas de registro anterior y siguiente
 
Hola

Amigos necesito de su valiosa ayuda. Estoy desarrollando un programa de pedidos, donde tengo un TEdit con el nombre de Codigo_Producto y cuando le doy enter me despliega en un DBGrid todos aquellos código de la tabla de inventario que tengan relación con ese código que se dígito, hasta aquí todo me funciona bien, pero estoy poniendo dos botones, uno para seguir con el siguiente código y el otro botón para ir al código anterior. Pero no se como hacerlo. Si me puede ayudar se los voy agradecer.

:confused:

Aqui les dejo el codigo de la consulta por código el producto.

Código Delphi [-]
procedure TMovimiento_Pedidos.Codigo_ProdKeyPress(Sender: TObject;
  var Key: Char);
Var llavepadre , articulo1 : string;
    conteo, i : integer;

begin
if KEY = #13 then
  begin
    if (informacion <> 0) then
        limpia_pantalla
      else
      informacion := 1;

    nombre_prod.Text := codigo_prod.Text;
    nombre_producto1;

    IBQuery1.Close;
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add('select a.*, b.* from ARTICULOS a inner join ARTMOV b on b. ARMOVID = a.ARID where a.ARCODIGO = '''+Codigo_Prod.Text+'''');
    IBQuery1.Open;

    llavepadre := IBQuery1.FieldByName('ARMOVID').AsString;

    IBQuery2.Close;
    IBQuery2.SQL.Clear;
    IBQuery2.SQL.Add('select count(*) as contador from ARTMOV a where a.ARPADREID = '''+llavepadre+'''');
    IBQuery2.Open;

    //SG.RowCount := IBQuery2.FieldByName('contador').AsInteger;
    sg.RowCount := sg.RowCount + 1;

      if IBQuery2.FieldByName('contador').AsInteger = 0 then
        begin
          //--Application.MessageBox('No Tiene existencias','CONTROL DE MENSAJES',MB_OK);
          nombre_prod.SetFocus;
          exit;
        end;

      conteo := IBQuery2.FieldByName('contador').AsInteger;

  if conteo  > 0 then
    begin
    IBQuery2.Close;
    IBQuery2.SQL.Clear;
    IBQuery2.SQL.Add('select a.* from ARTMOV a where a.ARPADREID = '''+llavepadre+'''');
    IBQuery2.Open;

    for i := 0 to conteo do
      begin
        articulo1 := IBQuery2.FieldByName('ARMOVID').AsString;

        if IBQuery2.FieldByName('ARMOVID').AsString = llavepadre+'001' then
          base := floattostr(IBQuery2.FieldByName('AREXISTENCIA').AsInteger)
        else
        if IBQuery2.FieldByName('ARMOVID').AsString = llavepadre+'006' then
          begin
            desarme := floattostr(IBQuery2.FieldByName('AREXISTENCIA').AsInteger)
          end
        else
        if IBQuery2.FieldByName('ARMOVID').AsString = llavepadre+'007' then
          begin
            consignacion := floattostr(IBQuery2.FieldByName('AREXISTENCIA').AsInteger)
          end
        else
        if IBQuery2.FieldByName('ARMOVID').AsString = llavepadre+'009' then
          begin
            apartado := floattostr(IBQuery2.FieldByName('AREXISTENCIA').AsInteger)
          end
        else
        if IBQuery2.FieldByName('ARMOVID').AsString = llavepadre+'010' then
          otros := floattostr(IBQuery2.FieldByName('AREXISTENCIA').AsInteger);

     IBQuery2.Next;
      end;

    nombre_prod.Text := IBQuery1.FieldByName('ARNOMBRE').AsString;

    sg.Cells[0,sg.RowCount-2] := IBQuery1.FieldByName('ARCODIGO').AsString;
    sg.Cells[1,sg.RowCount-2] := IBQuery1.FieldByName('ARCODALT').AsString;
    sg.Cells[2,sg.RowCount-2] := IBQuery1.FieldByName('ARNOMBRE').AsString;
    sg.Cells[3,sg.RowCount-2] := IBQuery1.FieldByName('ARLINEA').AsString;costocol := FormatFloat('##,###,##0.00',IBQuery1.FieldByName('ARCOSTO').AsFloat);
    sg.Cells[4,sg.RowCount-2] := costocol;
    preciocol := FormatFloat('##,###,##0.00',IBQuery1.FieldByName('ARPRECIO1').AsFloat);
    sg.Cells[5,sg.RowCount-2] := preciocol;
    costodol := FormatFloat('##,###,##0.00',IBQuery1.FieldByName('ARCOSTOM2').AsFloat);
    sg.Cells[6,sg.RowCount-2] := costodol;
    preciodol := FormatFloat('##,###,##0.00',IBQuery1.FieldByName('ARPRECIO1M2').AsFloat);
    sg.Cells[7,sg.RowCount-2] := preciodol;
    SG.Cells[8,SG.RowCount-2] := base;
    SG.Cells[9,SG.RowCount-2] := consignacion;
    SG.Cells[10,SG.RowCount-2] := apartado;
    SG.Cells[11,SG.RowCount-2] := desarme;
    SG.Cells[11,SG.RowCount-2] := otros;

    if nombre_prod.Text = '' then
    begin
      showmessage('Codigo del Articulo NO EXISTE !!');
    end;

    codigo_prod.SetFocus;
  end;
  end;
end;

Esto funciona bien, lo que no se, es como hago si coloco los dos botones para que el programa, lea el siguiente registro y el registro anterior, apartir del registro dado.

Gracias

Casimiro Notevi 15-10-2013 16:39:42

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

Pericles 15-10-2013 16:54:43

Hola, en principio podrias ejecutar la consulta talcual pero con

Código Delphi [-]
strToInt ( strToInt(Codigo_Prod.Text)+1) 
strToInt ( strToInt(Codigo_Prod.Text)-1)

En todo caso se podrias ver el ID del seleccionado y luego hacer la busqueda con el + - Id (esto por si los codigos no tienen nada que ver entre si)
ej: id-1 cod 145658 / id-2 cod 000448.
De esta manera vas recorriendo el siguiente codigo no el siguente numero del codigo ingresado.

Saludos
Nicolas Perichon

Caral 15-10-2013 20:20:47

Hola
No entiendo la logica del programa.
En principio no veo el dbgrid, veo un stringrid.
Haces dos sentencias sql
1 para el ibquery1 y otra para el dos, estas estan seguidas, sin embargo casi de inmediato creas una condicion if conteo > 0 then la que cambia la sentencia del ibquery2 y esta es la que me da la impresion de que llena el stringgrid.
No entiendo.
Antes de poder moverse entre registros adelante y atras me parece que se deberia limpiar el codigo.
Saludos

Jorge Orozco 15-10-2013 23:26:49

Perdon si, lo que tengo es un stringrid.

En el ibquery2, hago la lectura de una segunda tabla que esta ligada al maestro de inventario (ibquery1), en la segunda cuento los registros y luego hago la lectura de los registros ligados.

En base a esto lleno el stringrid. Pero como te decia, esto me funciona bien. El problema esta en como hago la programación de los botones que están fuera del stringrid. para poder recorrer la tabla del maestro del inventario ?

Caral 15-10-2013 23:32:01

Hola
Como dije, seguro no entiendo bien.
Dices que el codigo recoge el dato segun el codigo de producto.
Luego lo pasa al stringrid.
Lo que no entiendo es si solo recoge un dato o toda la lista segun la sql ?.
Disculpa pero es que no entiendo como recorrer una tabla de adelante para atras si ya esta todo no lo entiendo.
Saludos

Caral 15-10-2013 23:37:44

Hola
No podrias ligar un dbnavigator al ibquery2 y eliminar las opciones que no necesites ?.
Saludos

Jorge Orozco 16-10-2013 00:05:45

Te lo explico mas sencillo, olvidemos del el stringrid y suponga que tengo en TEdit donde pide el código del un articulo de la tabla del inventario, y en base a ese código me llena otro TEdit donde esta el nombre del producto, nada más.

Ahora pongo dos botones, uno es siguiente y otro es atrás. Si le doy un click al siguiente, que el programa me pueda saltar al siguiente registro o atrás para que se desplace al registro anterior. y me despliegue el nombre del producto. Hay que tomar en cuenta, que puede ser que el codigo que se digita puede ser, ej: 30-710 y el siguiente registro puede se 30-755 y el registro anterior puede ser BS125458.

Espero que me haya explicado.

Gracias por su atención.

Caral 16-10-2013 00:13:40

Hola
Lo que veo es lo siguiente:
si tienes un sql asi:
Select * from articulos
te traera toda la tabla, pero si tienes:
Select * form articulos WHERE codigo = Edit1.text
Ya te trae SOLO ese codigo, osea, no vas a poder ir adelante o atras ya que no hay.
Por eso digo que me parece que el asunto esta en el sql, depende de como lo hagas te traera lo que necesites.
Sigo sin saber si estoy perdido.
Saludos

Jorge Orozco 16-10-2013 00:25:25

Exactamente el sql lo que hace es la segunda opcion.

Select * form articulos WHERE codigo = Edit1.text

Disculpa, lo que me quiere decir es que con este tipo de consulta no se puede avanzar ni hacia adelante, ni hacia atrás. De ser así, que me recomendaría.

Gracias

Caral 16-10-2013 00:27:27

Hola
Puedes hacer esa consulta, pero si quieres ir para adelante o atras deberas intercalarla con la consulta que te traiga todo.
No soy bueno en esto, recuerda que no soy programador, pero me parece que deberia ser asi.
Saludos

Jorge Orozco 16-10-2013 00:31:16

Hola.

Ok, vamos a ver como me va, de todos modos muchas gracias por su tiempo. Muy amable.

Saludos

Caral 16-10-2013 00:34:13

Hola
Vale, intentalo, si tienes mas dudas veremos a ver si por lo menos las entiendo...:D
Saludos


La franja horaria es GMT +2. Ahora son las 16:47:37.

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