PDA

Ver la Versión Completa : Como Generar Dos Ordenes automaticamente segun la cantidad de lineas


webmasterplc
06-04-2014, 14:26:26
Buenos dias estoy desarrollando un sistema de Laboratorios clinicos, la duda que tengo es la siguiente:
La orden de examenes no son fiscales por lo que se imoprimen en formas sin ningun tipo de membrete y muchaqs veces un mismo paciente tiene hasta 30 examenes pero En el formato de factura solo caben 11 lineas y cuando voy a emitir la fatura solo llamo el numero de orden o historia y se trae los items, pero cuando pasa de 11 me imorime en dos numeros de controles la misma facura y en venezuela eso no es legal, cada factura hoja debe llevar un numero diferente la oregunta es como hago para que el istema me divida la factura, si son 19 que el genere una factura con 11 lineas por ejemplo la factura 45 y luego automaticamente genere otra factura con los item que quedan osea la 46.

ecfisa
06-04-2014, 21:43:27
Hola webmasterplc.


¿ Estas imprimiendo mediante un reporteador o directamente en la impresora ?
¿ Que base de datos estas usando ?
¿ Con que controles data aware te conectas a ella ?
¿ Cuál es, en líneas generales, la sentencia/s SQL que estas usando para generar la factura ?


Saludos :)

webmasterplc
07-04-2014, 04:59:50
Ok imprimo mediante reporteador Fast Report
Uso Mysql
me conecto con MyDac
y este es el codigo que uso para generar la factura


procedure TformTotalizar.btn4Click(Sender: TObject);
var
pfactura,npfactura:Integer;
begin
with datos.sqsetup do
begin
SQL.Clear;
SQL.Add('Select * From setup');
ExecSQL;
pfactura:= FieldByName('pfactura').AsInteger;
end;
npfactura:= pfactura+1;
with datos.sqsetup do
begin
SQL.Clear;
SQL.Add('Update setup');
SQL.Add('set pfactura=:npfactura');
ParamByName('npfactura').AsInteger:=npfactura;
ExecSQL; end; //Datos de factura
with datos.tfacturas do
begin
Close;
if Active=False then Active:=True;
Insert;
Append;
FieldByname('fact_numero').AsInteger := pfactura;
FieldByname('fact_fecha').AsDateTime := Now;
FieldByname('fact_ncontrol').AsString := edtncontrol.Text;
FieldByname('fact_codigohistoria').AsString := edthistoria.Text;
FieldByname('fact_nombre').AsString := edtrazonsocial.Text;
FieldByname('fact_codigocliente').AsString := codigocliente;
FieldByname('fact_rif').AsString := edtrif.Text;
FieldByname('fact_exento').AsCurrency := totalfactura;
FieldByname('fact_total').AsCurrency := totalfactura;
FieldByname('fact_direccion').AsString:= edtdireccion.Text;
FieldByname('fact_paciente').AsString:= edtpaciente.Text;
Post;
end;

webmasterplc
07-04-2014, 05:00:21
coloco el codigo dentro de las etiquetas delphi y me queda asi

ecfisa
07-04-2014, 05:33:16
coloco el codigo dentro de las etiquetas delphi y me queda asi
No te preocupes no es tu culpa, es un problema que se provoca con la previsualización cuando se utiliza la interfaz mejorada (WYSIWYG).

Ya corregí el código en tu mensaje.

Saludos :)

duilioisola
07-04-2014, 19:42:47
Supongo que el SQL debería traer 11 registros imprimir y luego buscar los siguientes 11.

Inicias un bucle con una variable con valor 0 (cero).
Ejecutas el SQL select first 11 skip (11 * :bucle) id_a from examenes order by examen
incrementas el valor del bucle
Ejecutas nuevamente el SQL. Te devolverá los primeros 11 habiendo saltado 11
Y repites esto tantas veces sea necesario hasta que no recibas registros.


bucle := 0;
repeat
Facturas.SQL.Text := 'select first 11 skip (11 * :bucle) id_a from examenes order by examen'
Facturas.Param.ByName['BUCLE'].AsInteger := bucle;
Facturas.Open;

if not Facturas.EOF then
// Imprimir
until Facturas.EOF;

webmasterplc
14-05-2014, 04:56:45
Hola lo que necesito es traer los registros de 11 en 11 y pasarlos a una tabla temporal a travez de un boton, por ejemplo hago la consulta traigo mis egistros, proceso mi factura hago que se quede en el mismo formulario y apreto el boton hasta que no me yraiga registros uso el codigo este pero me da este error.

ecfisa
14-05-2014, 08:03:21
Hola webmasterplc.

La idea que te sugirió duilioisola es la correcta, seguramente se trate de algún error sintáctico o de implementación. Por otro lado recuerda que es de mucha ayuda que escribas textualmente el mensaje de error que estas recibiendo (el código donde se produce tampoco viene mal).

Para que compruebes que funciona, te pongo un ejemplo donde desde una tabla, se ván cargando once campos en un ListBox cada vez que se hace click en un botón:

...
implementation

var
Count: Integer = 0;

procedure TForm1.BringEleven(var Count: Integer);
begin
IBQuery1.Close;
IBQuery1.SQL.Text:='SELECT FIRST(11) SKIP(11*:NUM) UN_CAMPO FROM TU_TABLA';
IBQuery1.ParamByName('NUM').AsInteger:= Count;
IBQuery1.Open;
if not IBQuery1.IsEmpty then
begin
// :: Aqui lo que quieras hacer con los 11 registros obtenidos
while not IBQuery1.Eof do
begin
ListBox1.Items.Add(IBQuery1.FieldByName('UN_CAMPO').AsString);
IBQuery1.Next;
end;
// ::
Inc(Count);
end
else Count:= -1
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Count <> -1 then
begin
BringEleven(Count);
ListBox1.Items.Add('----------------------------');
end;
end;

te queda adaptarlo a tus necesidades.

Saludos :)

webmasterplc
14-05-2014, 12:53:29
VVoy a seguir revisando ofrezco mil discupas por lo del error porque intente adjuntar el pantallazo y creo que no subio excuse me

webmasterplc
14-05-2014, 13:46:55
efectivamente es un error de sisntaxy en mysql aca le adjunto el error

ecfisa
14-05-2014, 14:13:29
Hola webmasterplc.

Por lo que veo estas trabajando con MySQL y si no me equivoco, en este gestor la función equivalente a FIRST/SKIP de Firebird es LIMIT.

Entonces creo que la sintáxis SQL en tu caso debería ser:

SELECT * FROM TU_TABLA LIMIT 11, 11 * :NUM

Pero no uso MySQL así que sería bueno que vieras mas detalles del uso de la cláusula (por ejemplo aquí: Using MySQL LIMIT (http://www.mysqltutorial.org/mysql-limit.aspx)).

Saludos :)

webmasterplc
14-05-2014, 17:39:37
Hola efectivamente etudie la clausula limit alli hay que pasarle dos parametros
Select * from tutabla limit 0,11
el primer parametro indica desde que fila comensara a traer registros y el segundo la cantidad, lo hice bien, pero cada vez que le doy al boton me llama 11 registros pero siempre los primeros 11 , creoq ue tengo que aumentar el contador pero la verdad no se como, aqui les dejo como quedo la consulta

var
Count: Integer;

procedure Tformfacturar.BringEleven(var Count: Integer);
begin
Count:=0;
datos.sqfacturas.Close;
datos.sqfacturas.SQL.Text:='SELECT * FROM dhistoria LIMIT :NUM, 11';
datos.sqfacturas.ParamByName('NUM').AsInteger:=Count;
datos.sqfacturas.Open;
if not datos.sqfacturas.IsEmpty then
begin
// :: Aqui lo que quieras hacer con los 11 registros obtenidos
while not datos.sqfacturas.Eof do
begin
Lst1.Items.Add(datos.sqfacturas.FieldByName('nhistoria').AsString);
datos.sqfacturas.Next;
end;
// ::
Inc(Count);
end
else Count:= -1
end;

ecfisa
14-05-2014, 18:03:31
Hola webmasterplc.
...el primer parametro indica desde que fila comensara a traer registros y el segundo la cantidad, lo hice bien, pero cada vez que le doy al boton me llama 11 registros pero siempre los primeros 11...
Intenta cambiando la consulta actual:
SELECT * FROM dhistoria LIMIT :NUM, 11
por:
SELECT * FROM dhistoria LIMIT :NUM * 11, 11

Saludos :)

webmasterplc
14-05-2014, 19:41:53
Hice el cambio y me da error
aqui lo adjunto

ecfisa
14-05-2014, 20:26:44
Hola webmasterplc.

Me parece que esta es mas una cuestión propia de MySQL que de impresión, seguramente te convenga consultar como realizar esa sentencia SQL en el foro MySQL de Club Delphi.

Te sugiero esto por que ese foro es frecuentado por expertos en ese gestor de base de datos y con seguridad te podrán señalizar por que se produce el error mas rápidamente.

Saludos :)

webmasterplc
14-05-2014, 21:08:49
ok Gracias Hermano

webmasterplc
14-05-2014, 21:17:02
Buenas estoy realizando una consulta para traer registros de 11 en 11 para eso tenego un contador pero cuando ejecuto la consulta me da un error que adjuntare en el mensaje, el codigo para realizarlo es el siguiente.


var
Count: Integer;

procedure Tformfacturar.BringEleven(var Count: Integer);
begin
Count:=0;
datos.sqfacturas.Close;
datos.sqfacturas.SQL.Text:='SELECT * FROM dhistoria LIMIT :NUM * 11, 11';
datos.sqfacturas.ParamByName('NUM').AsInteger:=Count;
datos.sqfacturas.Open;
if not datos.sqfacturas.IsEmpty then
begin
// :: Aqui lo que quieras hacer con los 11 registros obtenidos
while not datos.sqfacturas.Eof do
begin
Lst1.Items.Add(datos.sqfacturas.FieldByName('nhistoria').AsString);
datos.sqfacturas.Next;
end;
// ::
Inc(Count);
end
else Count:= -1
end;

el procedimiento lo llamo desde un boton
if Count <> -1 then
begin
BringEleven(Count);
end;
end;

Casimiro Notevi
14-05-2014, 22:58:41
No crees un nuevo tema para seguir con lo mismo. He unido ambos hilos. Gracias por tu colaboración.
http://www.clubdelphi.com/foros/guiaestilo.php

webmasterplc
15-05-2014, 00:17:03
Discume tome una sugerencia de la respuesta anterior

Casimiro Notevi
15-05-2014, 00:21:28
Es que en el mensaje que has puesto, no preguntas nada, se te ha olvidado :)

En fin, que está claro que es el mismo tema, que no has sabido solucionarlo, pero está muy claro, tan solo tienes que "traducir" esa instrucción sql al lenguaje que use mysql, para ello debes consultar la documentación del mismo. Como ya te ha explicado y aconsejado ecfisa.

ecfisa
15-05-2014, 13:32:12
Buenas estoy realizando una consulta para traer registros de 11 en 11 para eso tenego un contador pero cuando ejecuto la consulta me da un error que adjuntare en el mensaje, el codigo para realizarlo es el siguiente.

var
Count: Integer;

procedure Tformfacturar.BringEleven(var Count: Integer);
begin
Count:=0; <<== AQUI !
...
end;

el procedimiento lo llamo desde un boton
if Count <> -1 then
begin
BringEleven(Count);
end;
end;

Hola webmasterplc.

Mas allá de la sentecia SQL, en la que no te puedo ayudar por mi desconocimiento en MySQL, inicializando la variable Count al inicio del procedimiento BringEleven siempre te devolverá los primeros 11 registros.

Fijate que en el mensaje #8 la inicializo en su declaración:

implementation

var
Count: Integer = 0;
...


También aprovecho a aclarar, que mi sugerencia fué que preguntaras en el foro MySQL solamente sobre como usar LIMIT en la función SQL para que devuelva de a once registros, pero no que replantearas toda la problemática expuesta en este hilo.

Saludos :)

webmasterplc
16-05-2014, 03:08:07
Ok ho Gracias y disculpa el mal entendido voy a seguir tratando

webmasterplc
16-05-2014, 04:57:28
Y se paso los registros de la consulta a un array y luego los voy incluyedo en la tabla en memoria de 11 en 11 seria posible?

webmasterplc
16-05-2014, 05:11:27
Bueno le sumo 11 al count y si funciona no se si sea lo mas opcitmo pero el codigo lo deje asi
procedure Tformfacturar.BringEleven(var Count: Integer);
begin

datos.sqfacturas.Close;
datos.sqfacturas.SQL.Text:='SELECT * FROM dhistoria WHERE nhistoria = :historia LIMIT :NUM , 11';
datos.sqfacturas.ParamByName('NUM').AsInteger:=Count;
datos.sqfacturas.ParamByName('historia').AsInteger:=StrToInt(ethistoria.Caption);
datos.sqfacturas.Open;
if not datos.sqfacturas.IsEmpty then
begin
// :: Aqui lo que quieras hacer con los 11 registros obtenidos
while not datos.sqfacturas.Eof do
begin
Lst1.Items.Add(datos.sqfacturas.FieldByName('codigo').AsString);
datos.sqfacturas.Next;
end;
// ::
Count:=Count + 11;
end
else Count:= -1