PDA

Ver la Versión Completa : restar entre 2 tablas de mysql y mostrar en reporte


edgar_prospero
05-09-2012, 23:33:07
que hay amigos traigo un problemilla, resulta que estoy haciendo un proyecto de entradas y salidas y guardo los datos en mysql, hasta ahi todo bien lo que quiero hacer es hacer una consulta, por ejemplo hay un producto de codigo x ese producto tuvo 5 entradas y esta en la tabla entradas y ese mismo producto tuvo 3 salidas y esta en la tabla salidas eso quiere decir que de existencia tengo 2 del codigo x, entonces quiero que me reste los que son del mismo codigo de la tabla entradas y salidas y mostrar el resultado en un Tquickreport ojala alguien pueda orientarme

Caral
05-09-2012, 23:38:02
Hola
Es una resta de dos campos a dos tablas, pero sin saber los campos es dificil adivinar.
Saludos

edgar_prospero
05-09-2012, 23:42:04
tienes toda la razon omiti informacion importante jeje mira entradas y salidas tienen los mismos campos que son
codigo
nombre
unidad
cantidad
precio
importe

entonces mas o ,menos lo que necesito es de cada codigo sumar cantidad de cada tabala y restarlo y mostrar en el reporte (Tquickreport) codigo, nombre y existencia esta ultima la cual es el resultado de la resta

Casimiro Notevi
05-09-2012, 23:43:23
Y además de lo que comenta Caral, la segunda parte de la pregunta no tiene nada que ver con la primera, sacar un informe no tiene nada que ver con hacer un cálculo entre tablas, deberías de separar las preguntas en hilos distintos.

edgar_prospero
05-09-2012, 23:44:56
ok entones la que me interesa ahorita es la de sacar la resta de las 2 tablas si me pueden echar la mano en eso se los agradeceria ya lo del reporte veo si puedo ajustarlo si no pues abro otro hilo

Casimiro Notevi
05-09-2012, 23:45:57
tienes toda la razon omiti informacion importante jeje mira entradas y salidas tienen los mismos campos que son
codigo
nombre
unidad
cantidad
precio
importe


¿Y por qué lo tienes en 2 tablas, en lugar de en una?

codigo
nombre
unidad
cantidad
cantidad
precio
importe
tipomovimiento (1.entrada || 0.salida) o también 'E' / 'S'

Incluso sin poner ese campo nuevo, si la cantidad es positiva es entrada y si la cantidad es negativa es salida.

Caral
05-09-2012, 23:49:17
Hola

select codigo, nombre, unidad, precio, importe, sum(cantidad) as cantidad-entra
(select codigo, nombre, unidad, precio, importe, sum(cantidad) as cantidad-sale from salidas)
from entradas
group by codigo, nombre, unidad, precio, importe

despues en el reporte colocas un qrdb y haces la resta
a ojo, no se si funcione.
Saludos

edgar_prospero
06-09-2012, 00:02:36
pues asi estructure mi programa como se lleva un control por folio en numero consecutico de cada entrada y salida por eso de hacerlo en 2 tablas, y de la manera como me dices amigo caral me marca error se sintaxis

Caral
06-09-2012, 00:05:32
Hola
Yo en sql soy muy malo, lo que hago es sencillo.
Tengo una copia de mi BD en access el cual tiene un generador de consultas sql muy bueno.
Creo la consulta en access y luego la paso a firebird, con los cambios que necesite.
De mysql a access se puede pasar muy facilmente y ahi puedes crear las consultas muy sencillamente.
Saludos

Caral
06-09-2012, 00:19:06
Hola
Mira tu consulta creada por access:

SELECT DISTINCT Entradas.Codigo, Entradas.Unidad, Salidas.Codigo, Salidas.unidad, Sum(Entradas.cantidad) - Sum(Salidas.Cantidad) AS restacantidad
FROM Entradas INNER JOIN Salidas ON Entradas.Codigo = Salidas.Codigo
GROUP BY Entradas.Codigo, Entradas.Unidad, Salidas.Codigo, Salidas.unidad;

De que funciona funciona.:D
Saludos

edgar_prospero
06-09-2012, 00:33:39
ok gracias por tu respuesta tratare de implementarlo de esa manera a ver que tal me va

edgar_prospero
06-09-2012, 02:01:48
hola
volviendo de nuevo por aqui lo implemente como me dijiste pero me marca un error que dice 'tablename must be defined'

Caral
06-09-2012, 02:03:14
Hola
Deberias poner aqui la sentencia sql que hiciste para ver si hay algun error
Saludos

edgar_prospero
06-09-2012, 02:06:51
ok mira el resultado lo quiero mostrar en un dbgrid y la forma que lo utilice fue la siguiente:

procedure TForm12.Button1Click(Sender: TObject);
begin


tabla.Open;

tabla.Close();
tabla.SQL.Text:='SELECT DISTINCT Entradas.Codigo, Entradas.Unidad, Salidas.Codigo, Salidas.unidad, Sum(Entradas.cantidad) - Sum(Salidas.Cantidad) AS restacantidad'+
'FROM Entradas INNER JOIN Salidas ON Entradas.Codigo = Salidas.Codigo'+
'GROUP BY Entradas.Codigo, Entradas.Unidad, Salidas.Codigo, Salidas.unidad';
tabla.Open;
end;

edgar_prospero
06-09-2012, 02:10:54
lo puse directamente en un query en un programa que se llama sqlyog y si me da resultado pero mal tengo 3 entradas y 2 salidas y deberia de dar 1 colmo resultado y me esta arrojando 0

Caral
06-09-2012, 02:12:08
Hola
La sentencia esta bien, estas seguro que el nombre de las tablas es Entradas y Salidas, ademas del nombre de los campos ?.

procedure TForm12.Button1Click(Sender: TObject);
begin
tabla.SQL.Text:='SELECT DISTINCT Entradas.Codigo, Entradas.Unidad, Salidas.Codigo, Salidas.unidad, '+
' Sum(Entradas.cantidad)-Sum(Salidas.Cantidad) AS restacantidad '+
' FROM Entradas INNER JOIN Salidas ON Entradas.Codigo = Salidas.Codigo '+
' GROUP BY Entradas.Codigo, Entradas.Unidad, Salidas.Codigo, Salidas.unidad ';
tabla.Open;
end;


Saludos

edgar_prospero
06-09-2012, 02:13:53
si totalmente seguro que son los nombres correctos, y esa sentencia la ejecuto en un programa que se llama sqlyog y si me arroja el resultado pero mal tengo 3 entradas y 2 salidas y me pone resultado 0

Caral
06-09-2012, 02:17:25
Hola
Veamos a ver si me entero:
Para mi las entradas y las salidas estan en el campo cantidad en las dos tablas, es eso lo que necesitas o es otra cosa ?.
Saludos

edgar_prospero
06-09-2012, 02:24:05
mira tengo 3 tablas una es productos en la cual se da de alta el producto, otra es entradas aqui se van agregando los productos que entran a la tienda por codigo y la tercer tabla es salidas las cuales se van metiendo cuando sale un producto de la tienda mi finalidad es que si tengo entradas de un producto por asi decirlo 3 ahi tengo en existencia 3 pero en cuanto entre una salida debo de tener en existencia 2.
me imagino que se tiene que restar el campo cantidad de todos los codigos iguales entres las 2 tablas(entradas y salidas), practicamente es un programa de inventario

Caral
06-09-2012, 02:29:26
Hola
El codogo que te di deberia restar la suma del campo cantidad de la tabla entradas con la suma del campo camtidad de la tabla salidas.
Si por cada entrada de producto la cantidad es uno y lo mismo pasa en la tabal salidas el total sera cero, eso es seguro.
Ahora si es asi lo que necesitarias es simplemente sumar la cantidad de registros, asi si te dara la cantidad de entradas y salidas.
Me sigue pareciendo que la opcion logica es poner un campo existencias en la tabla productos y hacer un sencillo update por cada entrada y salida.
saludos
Edito: Deberias ver si el te esta restando la totalidad si es asi se necesitaria generar una condicion a la sentencia sql

edgar_prospero
06-09-2012, 02:31:24
pues mira ya ando un poco perdido si me pudieras ayudar para implementarlo de esa forma agregando un campo existencias en mi tabla productos y de como puedo hacerle te lo agradeceria mucho

Caral
06-09-2012, 02:34:48
Hola
Simplemente agrega el campo existencias a la tabla productos.
coloca aqui el codigo que usas para hacer una entrada o una salida y te pongo un ejemplo.
Pon tambien los campos de la tabla productos para estar mas seguro.
Saludos
PD: Ponle a un producto determinado (como prueba) una existencia X para que veas como se hace el update.

edgar_prospero
06-09-2012, 02:41:09
a ver si me explico de otro form voy metiendo los datos en un dbgrid de la siguiente forma

form4.clientdataset1.Append;


form4.clientdataset1['serie'] := form4.serie.Text;
form4.clientdataset1['documento']:=form4.documento.Text;
form4.clientdataset1['folio'] := form5.folio.Text;
form4.clientdataset1['codigo'] := form5.codigo.Text;

form4.clientdataset1['nombre'] := form5.nombre.Text;
form4.clientdataset1['cantidad'] := form5.cantidad.Text;
form4.clientdataset1['precio'] := form5.precio.Text;
form4.clientdataset1['unidad']:=form5.unidad.Text;
form4.clientdataset1['id']:=form5.id.Text;
form4.clientdataset1['importe']:= floatToStr( StrTofloat(form5.cantidad.Text) * StrTofloat(form5.precio.Text) );

form4.clientdataset1['fecha'] := form4.fecha.Date;

form4.clientdataset1.Post;


ya que tengo las entradas que voy a meter en mi base de datos por medio de un boton guardar que tiene el siguiente codigo los mando a la base de datos:

clientdataset1.ApplyUpdates(0);

showmessage('grabado con exito ');

los campos de mi tabla productos son:
codigo, nombre, fecha,precio, status, fec_baja, unidad, cantidad, id, existencias

Caral
06-09-2012, 03:03:07
Hola
Tienes un boton en el que aplicas el update del dataset.
No se que componente usas para conectarte pero digamos que es un query normal.
Coloca un query (del componente que uses) lo conectas a la bd y pones este codigo en el boton del update.

Primero cuentas o sumas el dato del campo cantidad de la tabla entradas, lo guardas en una variable:
Despues generas el update de la tabla productos del campo existencias.

var dato: real;
begin
// guardas los datos, esto ya lo estas haciendo en ese boton
clientdataset1.ApplyUpdates(0);
showmessage('grabado con exito ');

//Sumo el campo cantidad, segun el codigo del producto
Query1.slq.text.= 'Select sum(cantidad) as cantidad from Entradas where codigo = :cod';
Query1.Params[0].Value:= form5.codigo.Text;
Query1.Open;
dato:= FloatToStr(Query1.Fields[0].Text);
Query1.Close;

// genero el update de la tabla productos al campo existencias, segun el codigo del producto
Query1.SQL.Text := 'Update Productos set Existencias = Existencias + :Nuevodato Where Codigo = :cod';
Query1.Params[0].Value:= dato;
Query1.Params[1].Value:= form5.codigo.Text;
Query1.ExecSQL;

showmessage('existencia actualizada ');
end;


Espero que lo entiendas.^\||/
Saludos

edgar_prospero
06-09-2012, 03:10:56
me marca este error [DCC Error] Unit4.pas(248): E2250 There is no overloaded version of 'FloatToStr' that can be called with these arguments

en esta linea
dato:= FloatToStr(Query1.Fields[0].Text);

Caral
06-09-2012, 03:19:40
Hola
Puede ser:
1- que el campo cantidad sea integer y no float en tu tabla.
de ser asi, cambia estas lineas:

var dato: Integer;
y esta:
dato:= StrToInt(Query1.Fields[0].Text);

2- puede ser al reves si el campo en la tabla es float:
cambialo asi:
dato:= StrToFloat(Query1.Fields[0].Text);


Saludos

roman
06-09-2012, 04:11:48
me marca este error [DCC Error] Unit4.pas(248): E2250 There is no overloaded version of 'FloatToStr' that can be called with these arguments

en esta linea
dato:= FloatToStr(Query1.Fields[0].Text);

La función FloatToStr recibe un número flotante como parámetro y tú le estás pasando una cadena. Si tu campo realmente es de este tipo entonces basta que pongas:


dato:= FloatToStr(Query1.Fields[0].AsFloat);


Pero, por otro lado, dado que, al parecer, quieres el valor en formato de texto, entonces ni siquiera tienes que usar FloatToStr y simplemente pones:


dato:= Query1.Fields[0].AsString;


// Saludos

edgar_prospero
06-09-2012, 16:47:51
efectivamente ese era mi error ya se pudo ejecutar el programa y no marca error pero no actualiza el campo de existencias no se si me este faltando algo en el componente

edgar_prospero
06-09-2012, 17:46:54
ya logre hacer que me afecte inventarios pero hay nu detalle, si meto una entrada con cantidad de 5 en existencias me aparecen 5 ahi todo bien
pero si con ese mismo codigo agrego otra entrada con cantidad 1 deberia de dejarme en existencias 6 pero me vuelve a sumar los 5 que tenia en un principio y me aparece 11

Caral
07-09-2012, 00:12:34
Hola
Declara al principio del codiigo:
Dato:= 0;

Asi la variable se iniciara siempre en cero.
Saludos

edgar_prospero
07-09-2012, 00:19:44
pues no amigo sigue en las mismas por ejemplo si tengo un un folio con varios registros ya guardados y ese folio lo vuelvo a abrir en un dbgrid para agregar otro registro me vuelve a actualizar los codigos que estan ahi

Caral
07-09-2012, 00:23:52
Hola
No entiendo, creo que el problema es que guardas varios productos a la vez, osea, vas cargando los productos en el dbgrid y luego los guardas.
me parece que para que el codigo de actualización sea eficiente tiene que estar en el codigo que guarda cada item.
Saludos

edgar_prospero
07-09-2012, 00:29:54
tratare de explicar mi codigo a ver si me doy a entender, en un form tengo varios edit los cuales voy llenando con los datos(codigo, nombre, precio, etc) ahi con un boton lo envio a otro edit donde tengo un dbgrid entonces se agrega el primer registro y asi puedo agregar todos los registros que necesite pero solo estande manera temporal ya que uso un clientdataset, ya que quiero guardarlo utilizo un boton que uso con solo el codigo clientdataset1.ApplyUpdates(0); y todos esos registros se guardan con un folio por decir 2, si ya despues me doy cuenta que me falto agregar otro registro con ese nuemro de folio lo vuelvo a mostrar en el dbgrid con todosl los registrs que tienen ese folio lo agrego y otra vez le doy en guardar pero solo me guarda el ultimo codigo que agregue, y con lo que estamnos haciendo ahorita me vuelve a sumar todas las cantidades, no se si abra otra manera de intentarlo

Caral
07-09-2012, 00:38:51
Hola
Te voy a explicar como se hace normalmente un sistema de inventario.
Se tienen:
1 tabla productos
1 tabla transacciones.
En la tabla productos se tiene un campo existencias y los datos del producto
en la tabla transacciones se tiene un campo que define si es entrada (E) o salida (S) y la fecha de la transaccion.
Es muy sencillo llevar estas dos tablas.
Al tener el concepto que llevas te complicas mas de la cuenta sin sentido.
Estructurar esto es muy sencillo, casi lo tienes listo.
saludos

edgar_prospero
07-09-2012, 00:42:52
si entiendo lo que me quieres decir pero mi problema esta en que tengo que llevar entradas en una tabla y salidas en otra porque van ordenadas por un folio consecutivo por eso no utilizo una tabla, e ahi por que me estoy complicando la existencia pero me imagino que si debe de haber solucion a mi problema aunque este complicado

Caral
07-09-2012, 00:47:03
Hola
Cual es el problema en llevar un folio consecutivo de entradas y otro de salidas en una sola tabla ?.
Saludos

edgar_prospero
07-09-2012, 00:50:34
pues necesito un folio 1 para entradas y un folio 1 para salidas y aunque si se puede como que se me hizo mas revuelto pero al no a ver solucion a como lo quiero hacer creo que tratare de implementarlo de esa manera aunque tendre que cambiar gran parte de mi diseño

Caral
07-09-2012, 00:52:31
Hola
Dame un tiempo, voy a hacerte un ejemplo con access, pero con sql normal para que lo puedas aplicar a tu sistema.
Eso si, dame un rato.
Saludos

Caral
07-09-2012, 01:11:28
Hola
Viendo el tutorial de facturacion que puse en delphiaccess la parte de factura es muy similar a lo que quieres hacer, solo se tendrian que hacer muy pequeñas modificaciones.
AQUI (http://www.delphiaccess.com/forum/downloads/?sa=downfile&id=43) esta el archivo para que lo descargues, veas y me digas tus dudas.
Saludos
PD: Revisa el form factura.

edgar_prospero
07-09-2012, 01:24:16
no pues cada vez estoy mas perdido amigo no logro identificar que parte podria ayudarme con mi problema de restar 2 campos de tablas diferentes, creo que ya me bloquie en esto :confused:

Caral
07-09-2012, 01:26:54
Hola
No te bloquees, revisa el codigo del form factura, ahi veras un boton guardar, revisa el codigo, lo que hace es esencialmente lo que he tratado de explicarte.
Tranquilo, te ayudaremos hasta que lo hagas.
Saludos

edgar_prospero
07-09-2012, 01:29:41
ok le voy a dar una buena revisada pero no se si sea compatible con lo que hago ya que yo no guardo los registros de esa manera utilizo un
clientdataset1.ApplyUpdates(0); y ya es el unico codigo que tengo en mi boton guardar

Caral
07-09-2012, 01:39:40
Hola
Yo no se si sigo sin entender algo.
1-Tienes una serie de edits
2-los llenas con informacion
3-los vas guardando.

Aqui es donde me pierdo,
1.los vas guardando presionando el boton que aplica el update o el codigo que contiene el POST los va guardando ?.
2-cada vez que incluyes un producto es diferente o siempre es el mismo con diferentes cantidades (cosa que no veo logica pero pregunto por si acaso).
Saludos

edgar_prospero
07-09-2012, 01:45:44
a ver si me explico en un form tengo varios edit los cuales lleno de informacion y por un boton los envio a otro form a un dbgrid ahi voy agregando los registros que necesite normalmente son diferentes codigos ya que tengo los que necesito ahora si le doy en el boton guardar donde tengo el clientdataset1.ApplyUpdates(0); y todos esos registros con su codigo cada uno se guardan con un solo numero de folio por ejmplo el 1, pero en los demas folio puedo volver a guardar regisrtos que ya haya guardado antes,ya que por ejemplo si me llegan 5 recamaras con codigo rec30 se me ocurre le doy entrada con su numero de folio y en una semana me llegan otras 2 recamaras de las mismas pues le doy entrada con otro numero de folio no se si me entiendas un poco

Caral
07-09-2012, 02:04:25
Hola
independientemente de las entradas o salidas o como las guardes lo que necesitas es saber la existencia de X producto, verdad ?.

Hagamos un ejercicio:
Digamos que tienes el mismo codigo que envia la informacion al dbgrid pero con un dato adicional y que solo guardara la informacion en una de las dos tablas, supongamos que es la tabla entradas, entonces:
a la tabla entradas le añades un campo llamado TIPO (Texto) 2
ahora colocas un combobox en el form y pones en el text.
Entrada
Salida

Con esto a la hora de guardar la informacion se sabrá si fue una entrada o una salida en una sola tabla (despues veremos la parte del folio que es mas sencilla)

Pondremos el codigo que va enviando al dbgrid (de momento) asi:

var A : String;
begin
// aqui se define si es entrada o salida dependiendo del combobox
If combobox.text = 'Entrada' then
begin
A:= 'E';
end
else begin
A:= 'S';
end;
// aqui se envia el dato al dbgrid
form4.clientdataset1.Append;

form4.clientdataset1['serie'] := form4.serie.Text;
form4.clientdataset1['documento']:=form4.documento.Text;
form4.clientdataset1['folio'] := form5.folio.Text;
form4.clientdataset1['codigo'] := form5.codigo.Text;

form4.clientdataset1['nombre'] := form5.nombre.Text;
form4.clientdataset1['cantidad'] := form5.cantidad.Text;
form4.clientdataset1['precio'] := form5.precio.Text;
form4.clientdataset1['unidad']:=form5.unidad.Text;
form4.clientdataset1['id']:=form5.id.Text;
form4.clientdataset1['importe']:= floatToStr( StrTofloat(form5.cantidad.Text) * StrTofloat(form5.precio.Text) );

form4.clientdataset1['fecha'] := form4.fecha.Date;
form4.clientdataset1['TIPO'] := Combobox1.text; // aqui esta el dato (entrada o salida)

form4.clientdataset1.Post;


Como ves en una variable guardo una letra que sera guardada en la tabla en el campo TIPO.
Empecemos por aqui y me dices como va.

Saludos

edgar_prospero
07-09-2012, 02:08:07
perfecto gracias por tu tiempo lo implementare de esa forma hay te digo como me fue

Caral
07-09-2012, 02:14:55
Hola
Despues de hacer esto seria muy sencillo generar una consulta que nos muestre los datos de una entrada o salida segun un numero de folio, una fecha determinada y un producto x.
Si sacamos este dato sera muy sencillo restar las entradas de las salidas segun un producto x, que es lo que necesitas, segun entiendo.
Saludos

edgar_prospero
07-09-2012, 02:16:23
listo ya a la hora de guardar ya se me guarda en tipo si es entrada o es salida ahora mi duda seria para asignarle su propio folio secuencial a cada entrada y a cada salida como seria por ejemplo tiene que haber un folio 1 tanto para entrdaas como para salidas

edgar_prospero
07-09-2012, 02:17:58
mira cuando abro por decir la entrada y mi ultimo folio que use era 4 mediante el siguiente codigo en el edit me aparecia 5 :



query.Close;
query.SQL.Text:='SELECT folio FROM entradas ORDER BY folio desc LIMIT 1';
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1) ;

Caral
07-09-2012, 02:20:45
Hola
Ese no es problema, aqui tuve un error revisalo otra vez, puse que se guardara el dato del combobox y no de la variable.
Si usas el codigo que puse no haria falta la variable para nada pero el campo seria mas grande para contener la palabra completa, osea asi:

// aqui se envia el dato al dbgrid
form4.clientdataset1.Append;

form4.clientdataset1['serie'] := form4.serie.Text;
form4.clientdataset1['documento']:=form4.documento.Text;
form4.clientdataset1['folio'] := form5.folio.Text;
form4.clientdataset1['codigo'] := form5.codigo.Text;

form4.clientdataset1['nombre'] := form5.nombre.Text;
form4.clientdataset1['cantidad'] := form5.cantidad.Text;
form4.clientdataset1['precio'] := form5.precio.Text;
form4.clientdataset1['unidad']:=form5.unidad.Text;
form4.clientdataset1['id']:=form5.id.Text;
form4.clientdataset1['importe']:= floatToStr( StrTofloat(form5.cantidad.Text) * StrTofloat(form5.precio.Text) );

form4.clientdataset1['fecha'] := form4.fecha.Date;
form4.clientdataset1['TIPO'] := Combobox1.text; // aqui esta el dato (entrada o salida)

form4.clientdataset1.Post;

Si usas el dato de la letra entonces seria asi:

var A : String;
begin
// aqui se define si es entrada o salida dependiendo del combobox
If combobox.text = 'Entrada' then
begin
A:= 'E';
end
else begin
A:= 'S';
end;
// aqui se envia el dato al dbgrid
form4.clientdataset1.Append;

form4.clientdataset1['serie'] := form4.serie.Text;
form4.clientdataset1['documento']:=form4.documento.Text;
form4.clientdataset1['folio'] := form5.folio.Text;
form4.clientdataset1['codigo'] := form5.codigo.Text;

form4.clientdataset1['nombre'] := form5.nombre.Text;
form4.clientdataset1['cantidad'] := form5.cantidad.Text;
form4.clientdataset1['precio'] := form5.precio.Text;
form4.clientdataset1['unidad']:=form5.unidad.Text;
form4.clientdataset1['id']:=form5.id.Text;
form4.clientdataset1['importe']:= floatToStr( StrTofloat(form5.cantidad.Text) * StrTofloat(form5.precio.Text) );

form4.clientdataset1['fecha'] := form4.fecha.Date;
form4.clientdataset1['TIPO'] := A; // aqui esta el dato (entrada o salida)

form4.clientdataset1.Post;
Revisa y me dices.
saludos

Caral
07-09-2012, 02:35:26
Hola
Cuando se necesita saber el numero de folio que sigue tanto de entradas como de salidas se hace asi:
usando el mismo combobox:

var A : String;
begin
// aqui se define si es entrada o salida dependiendo del combobox
If combobox.text = 'Entrada' then
begin
A:= 'E';
end
else begin
A:= 'S';
end;
query.Close;
query.SQL.Text:='SELECT max(folio) FROM entradas where tipo = '+A;
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1) ;

Como ves simplemente se saca el dato del folio dependiendo de si es entrada o salida en el campo que creaste.
saludos

edgar_prospero
07-09-2012, 02:57:06
mmm no me queda muy claro donde voy a usar ese codigo para el folio porque lo que yo necesitareia es que en cuanto entre al form en el combox pues tengo entradas por default entonces que me aparesca el numerp de folio que le correpsonde desde un principio y que si el combobox lo muevo a salidas automaticamente me ponga el folio que corresponde

Caral
07-09-2012, 02:58:17
Hola
En el evento OnChange del combobox.
Saludos

edgar_prospero
07-09-2012, 03:02:41
diras que como doy carrilla amigo pero me marca error column 's' in where clause creo que hoy la traigo de malas

edgar_prospero
07-09-2012, 03:07:28
porque checandolo salen mas detallitos por ejemplo si tengo un folio 1 de entrada y 1 de salida, tengo la funcion de que en el edit de folio tecleo 1 y me trae al dbgrid los registros con ese folio y en estos momentos le pongo 1 y me trae lso folio 1 de entrada y salida este codigo uso para trarme los datos con el evento key press:

if Key = #13 then
begin

query.Close;
query.SQL.Text := 'select * from entradas where folio=:txtfolio';
query.Params[0].Value := folio.Text;

query.Open;

serie.Text := query.FieldByName('serie').asString;
fecha.Date := query.FieldByName('fecha').AsDateTime;

clientdataset1.Close;
clientdataset1.Params.ParamByName('folio').AsInteger := StrToIntDef(Folio.Text, 0);
clientdataset1.Open;

Caral
07-09-2012, 03:09:48
Hola
1-revisa que el dato del campo sea esa S
2-Si es asi y no la palabra completa ponlo asi:

var A : String;
begin
// aqui se define si es entrada o salida dependiendo del combobox
If combobox.text = 'Entrada' then
begin
A:= 'E';
end
else begin
A:= 'S';
end;
query.Close;
query.SQL.Text:='SELECT max(folio) FROM entradas where tipo = '+QuotedStr(A);
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1) ;



o asi:

var A : String;
begin
// aqui se define si es entrada o salida dependiendo del combobox
If combobox.text = 'Entrada' then
begin
A:= 'E';
end
else begin
A:= 'S';
end;
query.Close;
query.SQL.Text:='SELECT max(folio) FROM entradas where tipo = '''+ A + '*''';
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1) ;

Vamos por partes amigo
Saludos

edgar_prospero
07-09-2012, 03:15:20
tiens razon me acelero jeje mira me sale este error ahora query:field 'folio' not found

Caral
07-09-2012, 03:19:06
Hola
Eso dice que el campo folio no lo encuentra, revisa que este bien escrito y por supuesto que este ese campo en la tabla.
amigo, se que no me conoces pero aqui saben que no soy programador, esto lo hago por hoovi, no esperes demasiado de este novato, trato de ayudar con mis pocos conocimientos de esto.
saludos

Caral
07-09-2012, 04:28:09
Hola
Ya nos contaras como te fue con esto.
Saludos

edgar_prospero
07-09-2012, 16:51:57
pues seras novato como dices pero me has echado mucho la mano amigo, ya pude hacer que no me marcara error el problema me sale por la parte de max(folio), lo cmabie por el siguiente codigo no me marca error pero en folio siempre me pone uno aunque tenga 10 siempre es 1

If combobox1.text = 'Entrada' then
begin
A:= 'E';
end
else begin
A:= 'S';
end;
query.Close;

query.SQL.Text:='SELECT folio FROM entradas where tipo = '''+ A + '*'' ';
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1) ;

Caral
07-09-2012, 17:00:23
Hola
Tal vez mysql no acepta max(), trata de usar Last(), asi:

If combobox1.text = 'Entrada' then
begin
A:= 'E';
end
else begin
A:= 'S';
end;
query.Close;

query.SQL.Text:='SELECT Last(folio) FROM entradas where tipo = '''+ A + '*'' ';
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1) ;
Saludos

edgar_prospero
07-09-2012, 17:19:45
no tampoco lo acepta no es correcta marca error de sintaxis, no se como se puda adecuar de la manera que yo lo hagopor jemplo con el siguiente codigo es como pongo mi utlimo folio +1 y no me da problema pero a esto no se puede acomodar nomas siempre me pone 1y como observacion en la parte qe le pngo +1 si le llego a poner +20 en el edit de folio aparece 20

query.Close;
query.SQL.Text:='SELECT folio FROM entradas ORDER BY folio desc LIMIT 1';
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1) ;

roman
07-09-2012, 18:04:01
no tampoco lo acepta


Desde luego que lo acepta. MySQL sí admite la función max.

// Saludos

edgar_prospero
07-09-2012, 18:06:10
pues entonces no se porque cuando pongo max(folio) me marca esto: query:field 'folio' not found y pues si existe folio y esta bien escrito

roman
07-09-2012, 18:26:33
El error no te lo da MySQL. Si fuera así, el error sería:


Unknown column 'folio' in 'field list'


El error te lo está dando el componente query y la razón es muy sencilla. En tu consulta no hay ningún campo llamado folio. Cuando pones:


select max(folio) from entradas


el resultado es un conjunto de datos con una columna y esa columna se llama 'max(folio)' y no folio.

Lo puedes resolver muy fácil poniendo un alias a la consulta:


select max(folio) as folio from entradas


O bien, leyendo el dato por su índice en lugar de su nombre:


folio.text := IntToStr(query[0].asInteger + 1) ;


// Saludos

edgar_prospero
07-09-2012, 18:42:13
pues efectivamente ya con el alias no marca error aunque todavia no logro mi objetivo que es si el ultimo folio usado es 3 en el edit folio me aparesca 4 que seria el siguiente a usar

edgar_prospero
07-09-2012, 19:54:55
pues como no logro hacer qe me quede estoy intentando otra cosa que pongo a continuacion pero nomas me funciona una vez al cargar el form el combobox esta en entradas y el nuemro de folio que le corresponde al mover el combobox a salidas el nuemro de folio se cambia al que le corresponde pero nomas esa vez me funciona si le vuelvo a poner en entradas ya nose mueve folio:

procedure TForm4.ComboBox1Change(Sender: TObject);

begin

if (ComboBox1.Text='ENTRADA') THEN
begin
query.Close;
query.SQL.Text:='SELECT folio FROM entradas ORDER BY folio desc LIMIT 1';
query.Open;
folio.text := IntToStr(query.FieldByName('folio').asInteger +1);

end
else begin
if (ComboBox1.Text='SALIDAS') THEN

query.Close;
query.SQL.Text:='SELECT folio2 FROM entradas ORDER BY folio2 desc LIMIT 1';
query.Open;
folio.text := IntToStr(query.FieldByName('folio2').asInteger +1) ;

end;

edgar_prospero
07-09-2012, 20:53:39
una disculpa fue error mio en lugar de entrada era entradas ya con ese cambio se logro lo que queria jeje muchas gracias por su ayuda este hilo ya es demasiado grande seguire avanzando y para mi siguiente duda abrire uno nuevo

Casimiro Notevi
07-09-2012, 21:58:11
una disculpa fue error mio en lugar de entrada era entradas ya con ese cambio se logro lo que queria jeje muchas gracias por su ayuda este hilo ya es demasiado grande seguire avanzando y para mi siguiente duda abrire uno nuevo

Si es una duda que no tiene nada que ver con esta, en caso contrario debes seguir aquí.