PDA

Ver la Versión Completa : Como hacer consultas de registro anterior y siguiente


Jorge Orozco
15-10-2013, 16:22:45
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.

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:

http://www.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

Pericles
15-10-2013, 16:54:43
Hola, en principio podrias ejecutar la consulta talcual pero con


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