Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-11-2017
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
NULL
 
Registrado: jun 2013
Posts: 129
Poder: 11
The Cid James Va por buen camino
Enviar resultado de operaciones a base de datos

Buenas gente, estoy tratando de calcular unos valor de unas operaciones a la base de datos pero el post "se hace en blanco"
Este es el código del botón que debería hacer el post a la base de datos pero al precionarlo no pasa nada ni siquiera sale un error.

Código Delphi [-]
procedure Tfcantidad.BCokClick(Sender: TObject);
var
a: integer; // Cantidad de Articulos
d: integer; // N° de venta anterior
e: integer; // N° de venta actual
f: integer; // Precio Unitario
g: integer; // Precio total por prdoducto

begin
  fmodulo.tVentadetalle.Active := true;
  fmodulo.tProductos.Active := true;
  fmodulo.tVentadetalle.Insert;
  if (strtoint(Ecantidad.Text)<=0)
    then
      begin
        Application.MessageBox('El valor ingresado debe ser mayor a O', 'Drugstore',mb_yesno+mb_iconquestion);
      end
  else
    if Ecantidad.Text = not null
      then
        begin
        a := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger;
        d := fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger;
        e := (d + 1);
        fmodulo.tVentadetalle ['id_ventas'] := IntToStr(e);
        fmodulo.tVentadetalle ['id_producto'] := fmodulo.tProductos ['id_producto'];
        f := fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger;
        g := (a * f);
        fmodulo.tVentadetalle ['Precio_v'] := IntToStr(g);
        fmodulo.tVentadetalle ['cantidad'] := IntToStr(a);
        fmodulo.tVentadetalle.Post;
        fmodulo.tVentadetalle.Refresh;
        end;
  self.Close;
end;

Como siempre muchas gracias
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.
Responder Con Cita
  #2  
Antiguo 15-11-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Haz un pequeño cambio para evaluar si el edit tiene algo digitado.

Código Delphi [-]
  //if Ecantidad.Text = not null
  if Length(Trim(Ecantidad.Text)) > 0

Si es XE3 o superior puede ser:
Código Delphi [-]
  //if Ecantidad.Text = not null
  if String(Ecantidad.Text).Trim.Length > 0
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 15-11-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola

Cita:
Empezado por The Cid James Ver Mensaje
Código Delphi [-]
    if Ecantidad.Text = not null
Y esa linea te compila???
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #4  
Antiguo 15-11-2017
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
Otra cosa, yo te recomendaria poner el insert junto al codigo donde asignas los valores a la tabla, porque primero haces el insert y luego tomas valores (pero los valores te los va a tomar en blanco porque esta el insert) y luego haces operaciones para guardar en la tabla... Saludos!
Responder Con Cita
  #5  
Antiguo 15-11-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Cita:
Empezado por Caminante Ver Mensaje
Y esa linea te compila???
Yo también quedé y repliqué eso en mi delphi. y Si! si compila y si haces debug cuando pones la expresión en el evaluador dice que la expresión es inválida.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #6  
Antiguo 15-11-2017
alexcarballo alexcarballo is offline
Registrado
NULL
 
Registrado: jun 2012
Posts: 2
Poder: 0
alexcarballo Va por buen camino
Eimina la línea:
fmodulo.tVentadetalle.Refresh;

El Refresh me ha dado ese error.
Responder Con Cita
  #7  
Antiguo 15-11-2017
alexcarballo alexcarballo is offline
Registrado
NULL
 
Registrado: jun 2012
Posts: 2
Poder: 0
alexcarballo Va por buen camino
Cita:
Empezado por luisgutierrezb Ver Mensaje
Otra cosa, yo te recomendaria poner el insert junto al codigo donde asignas los valores a la tabla, porque primero haces el insert y luego tomas valores (pero los valores te los va a tomar en blanco porque esta el insert) y luego haces operaciones para guardar en la tabla... Saludos!
Ademas si la tabla ya viene con datos lo que debes hacer es un Edit no Insert
Responder Con Cita
  #8  
Antiguo 16-11-2017
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
NULL
 
Registrado: jun 2013
Posts: 129
Poder: 11
The Cid James Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
Haz un pequeño cambio para evaluar si el edit tiene algo digitado.

Código Delphi [-]
  //if Ecantidad.Text = not null
  if Length(Trim(Ecantidad.Text)) > 0

Si es XE3 o superior puede ser:
Código Delphi [-]
  //if Ecantidad.Text = not null
  if String(Ecantidad.Text).Trim.Length > 0
La pripiedad text del edit tiene valor por defecto 0 por lo cual no podria estar vacio de todas formas

Cita:
Empezado por movorack Ver Mensaje
Yo también quedé y repliqué eso en mi delphi. y Si! si compila y si haces debug cuando pones la expresión en el evaluador dice que la expresión es inválida.
No se donde lo habia leido mientras buscaba informacion y me funciono asi que lo deje

Cita:
Empezado por alexcarballo Ver Mensaje
Eimina la línea:
fmodulo.tVentadetalle.Refresh;

El Refresh me ha dado ese error.
No se que error te da pero a mi no me marca nada de echo creo que el error esta en las asignaciones de las variables porque sino hago los calculos si hace el post (obviamente con resultados no calculados que no me sirve)

Cita:
Empezado por luisgutierrezb Ver Mensaje
Otra cosa, yo te recomendaria poner el insert junto al codigo donde asignas los valores a la tabla, porque primero haces el insert y luego tomas valores (pero los valores te los va a tomar en blanco porque esta el insert) y luego haces operaciones para guardar en la tabla... Saludos!
Tengo entendido que al poner la tabla en modo insert mientras dure el proceso no deberia causar problemas de echo tengo varias tablas que tengo en modo insert desde el momento que abro el form y postea bien

Cita:
Empezado por alexcarballo Ver Mensaje
Ademas si la tabla ya viene con datos lo que debes hacer es un Edit no Insert
Cada dato se calcula y postea en ese momento, sino hubiera usado el edit si fuera el caso.

Gracias a todos por la ayuda gente el error como dije anteriormente esta en los cálculos porque si inserto otros datos en la tabla sin hacer los cálculos si lo toma normalmente. También he notado que en ningun momento le asigno el valor del Edit a la variable A para hacer los cálculos y la verdad que no se como hacerlo busque en la web pero siempre me sale algún error
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.
Responder Con Cita
  #9  
Antiguo 16-11-2017
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
NULL
 
Registrado: jun 2013
Posts: 129
Poder: 11
The Cid James Va por buen camino
Probe lo que dijo movorack y efectivamente era eso, con eso postea los datos pero sigue sin hacer los calculos

Código Delphi [-]
begin
  fmodulo.tVentadetalle.Active := true;
  fmodulo.tProductos.Active := true;
  fmodulo.tVentadetalle.Insert;
  if (strtoint(Ecantidad.Text)<=0)
    then
      begin
        Application.MessageBox('El valor ingresado debe ser mayor a O', 'Drugstore',mb_yesno+mb_iconquestion);
      end
  else
    if String(Ecantidad.Text).Trim.Length > 0
      then
        begin
        a := (StrToInt(Ecantidad.text));
        a := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger;
        d := fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger;
        e := (d + 1);
        fmodulo.tVentadetalle ['id_ventas'] := IntToStr(e);
        fmodulo.tVentadetalle ['id_producto'] := fmodulo.tProductos ['id_producto'];
        f := fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger;
        g := (a * f);
        fmodulo.tVentadetalle ['Precio_v'] := IntToStr(g);
        fmodulo.tVentadetalle ['cantidad'] := IntToStr(a);
        fmodulo.tVentadetalle.Post;
        fmodulo.tVentadetalle.Refresh;
        end;
  self.Close;
end;

end.
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.
Responder Con Cita
  #10  
Antiguo 16-11-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
En este post ya AgustinOrtu te habia hecho comentarios sobre tu código.

Cita:
Empezado por AgustinOrtu Ver Mensaje
De todos modos, el codigo que publicaste esta raro y por eso te da problemas.
Primero convertis de string a Integer el contenido del edit, y lo guardas en una variable.
Luego, en lugar de usar esa variable, volves a convertir para la validacion.
Y despues de validar, asignas en la misma variable el valor de un campo de la tabla, osea el valor que asignaste al principio nunca lo usaste. Creo que eso responde al "no se supone que le estoy dando valor?"
Imagino que no lo leíste pq no hiciste ningún cambio. Y de verdad el fue amable con decir "raro" ya que eso tiene apelativos de mucho mas calibre.

No se a que calculos te frefieres porque este hilo trata de que no podias guardar en la DB pero de verdad, Revisa bien tu código.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #11  
Antiguo 17-11-2017
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
NULL
 
Registrado: jun 2013
Posts: 129
Poder: 11
The Cid James Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
En este post ya AgustinOrtu te habia hecho comentarios sobre tu código.



Imagino que no lo leíste pq no hiciste ningún cambio. Y de verdad el fue amable con decir "raro" ya que eso tiene apelativos de mucho mas calibre.

No se a que calculos te frefieres porque este hilo trata de que no podias guardar en la DB pero de verdad, Revisa bien tu código.
Si lo lei y si lo cambie, en ese momento no estaba usando los valores de la variables y si controle lo de asignarle de no asignarlo mal si te fijas en el código del post lo cambie ... bastante de echo igual me voy a poner a leer lo que encuentre a ver como lo soluciono

Saludos
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.
Responder Con Cita
  #12  
Antiguo 17-11-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
No se... Seguiste con las mismas asignaciones. lee los comentarios y entenderás un poco lo que trato de decirte

Código Delphi [-]
procedure TfCantidad.BCokClick(Sender: TObject);
var
  //Mejor coloca nombres de variables que signifiquen algo
  //a : Integer; // Cantidad de Articulos
  CantArts: integer; // Cantidad de Articulos
begin
  fmodulo.tVentadetalle.Active := true;
  fmodulo.tProductos.Active := true;

  //Esta validación la coloco acá porque la vienes haciendo en tu código,
  //pero es innecesaria o no estás haciendo bien las cosas ya que en ningún lugar de tus cálculos usas el valor del
  //TEdit Ecantidad. Si bien lo asignas a una variable mas adelante, enseguida a esa misma variable le asignas un 
  //valor traído del dataset
  if (string(Ecantidad.Text).Trim.Length = 0)
    or (not TryStrToInt(Ecantidad.Text, CantArts))  // <= Si la conversión es correcta, aquí ya se asigna el valor del edit a la variable
  then
  begin
    Application.MessageBox('El valor ingresado debe ser mayor a O', 'Drugstore',mb_yesno+mb_iconquestion);
    Exit;
  end;
  
  if fmodulo.tVentadetalle.State in [dsEdit, dsInsert] then
    fmodulo.tVentadetalle.Cancel;

  fmodulo.tVentadetalle.Insert;

  {
  a := (StrToInt(Ecantidad.text)); // Esta asignación la pierdes con la siguiente línea

  //Y no es necesario asignar a variable todo lo del dataset. Puedes usar los valores directamente
  a := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger;
  d := fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger;
  e := (d + 1);
  fmodulo.tVentadetalle ['id_ventas'] := IntToStr(e);
  fmodulo.tVentadetalle ['id_producto'] := fmodulo.tProductos ['id_producto'];
  f := fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger;
  g := (a * f);
  fmodulo.tVentadetalle ['Precio_v'] := IntToStr(g);
  fmodulo.tVentadetalle ['cantidad'] := IntToStr(a);
  }

  //El consecutivo trata de no calcularlo en el programa y dejarlo a que lo calcule la DB. Cuando tengas varios clientes al mismo tiempo vendiendo esto será un dolor de cabeza
  fmodulo.tVentadetalle.Fields.FieldByName('id_ventas').AsString := IntToStr(fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger + 1); 
  fmodulo.tVentadetalle.Fields.FieldByName('id_producto').Value := fmodulo.tProductos.Fields.FieldByName('id_producto').Value;
  fmodulo.tVentadetalle.Fields.FieldByName('Precio_v').AsString := IntToStr(fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger * fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger);
  fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsString := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsString;
  fmodulo.tVentadetalle.Post;
  fmodulo.tVentadetalle.Refresh;

  self.Close;
end;

He tratado de utilizar los mismos tipos de datos que al parecer tienes en tu dataset. pero cosas como el precio y cantidad es mejor que los coloques como float. EN un futuro pueden decirte que quieren vender medio paquete de cigarrillos o que el valor de un producto con oferta es de 9.99
__________________
Buena caza y buen remar... http://mivaler.blogspot.com

Última edición por movorack fecha: 17-11-2017 a las 16:39:08.
Responder Con Cita
  #13  
Antiguo 20-11-2017
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
NULL
 
Registrado: jun 2013
Posts: 129
Poder: 11
The Cid James Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
No se... Seguiste con las mismas asignaciones. lee los comentarios y entenderás un poco lo que trato de decirte

Código Delphi [-]
procedure TfCantidad.BCokClick(Sender: TObject);
var
  //Mejor coloca nombres de variables que signifiquen algo
  //a : Integer; // Cantidad de Articulos
  CantArts: integer; // Cantidad de Articulos
begin
  fmodulo.tVentadetalle.Active := true;
  fmodulo.tProductos.Active := true;

  //Esta validación la coloco acá porque la vienes haciendo en tu código,
  //pero es innecesaria o no estás haciendo bien las cosas ya que en ningún lugar de tus cálculos usas el valor del
  //TEdit Ecantidad. Si bien lo asignas a una variable mas adelante, enseguida a esa misma variable le asignas un 
  //valor traído del dataset
  if (string(Ecantidad.Text).Trim.Length = 0)
    or (not TryStrToInt(Ecantidad.Text, CantArts))  // <= Si la conversión es correcta, aquí ya se asigna el valor del edit a la variable
  then
  begin
    Application.MessageBox('El valor ingresado debe ser mayor a O', 'Drugstore',mb_yesno+mb_iconquestion);
    Exit;
  end;
  
  if fmodulo.tVentadetalle.State in [dsEdit, dsInsert] then
    fmodulo.tVentadetalle.Cancel;

  fmodulo.tVentadetalle.Insert;

  {
  a := (StrToInt(Ecantidad.text)); // Esta asignación la pierdes con la siguiente línea

  //Y no es necesario asignar a variable todo lo del dataset. Puedes usar los valores directamente
  a := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger;
  d := fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger;
  e := (d + 1);
  fmodulo.tVentadetalle ['id_ventas'] := IntToStr(e);
  fmodulo.tVentadetalle ['id_producto'] := fmodulo.tProductos ['id_producto'];
  f := fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger;
  g := (a * f);
  fmodulo.tVentadetalle ['Precio_v'] := IntToStr(g);
  fmodulo.tVentadetalle ['cantidad'] := IntToStr(a);
  }

  //El consecutivo trata de no calcularlo en el programa y dejarlo a que lo calcule la DB. Cuando tengas varios clientes al mismo tiempo vendiendo esto será un dolor de cabeza
  fmodulo.tVentadetalle.Fields.FieldByName('id_ventas').AsString := IntToStr(fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger + 1); 
  fmodulo.tVentadetalle.Fields.FieldByName('id_producto').Value := fmodulo.tProductos.Fields.FieldByName('id_producto').Value;
  fmodulo.tVentadetalle.Fields.FieldByName('Precio_v').AsString := IntToStr(fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger * fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger);
  fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsString := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsString;
  fmodulo.tVentadetalle.Post;
  fmodulo.tVentadetalle.Refresh;

  self.Close;
end;

He tratado de utilizar los mismos tipos de datos que al parecer tienes en tu dataset. pero cosas como el precio y cantidad es mejor que los coloques como float. EN un futuro pueden decirte que quieren vender medio paquete de cigarrillos o que el valor de un producto con oferta es de 9.99
Muchas gracias por tomarte el tiempo de explicarme!
Ahora bien voy a seguir tus consejos pero me quedan las siguientes dudas:
Si me di cuenta que no estaba usando el valor de la asignacion por eso no hacia los calculos, aunque no tenia ni idea de como hacerlo iba a hacer ahora un post con eso ahora que me tengo tiempo xD
En el caso de
Código Delphi [-]
  d := fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger;
  e := (d + 1);
Esto lo hacia porque uso un autoincremental en venta, pero el post se hace despues de que se realiza la venta por lo cual no se asigna igual no sabia que podía usar los datos directamente de la base de datos en tiempo de ejecución para hacer los cálculos.
Y la ultima duda que tengo es sobre
Código Delphi [-]
 if fmodulo.tVentadetalle.State in [dsEdit, dsInsert] then
    fmodulo.tVentadetalle.Cancel;

Este codigo es necesario? porque abro y cierro el modo insert en cada boton con el que trabajo o sirve como medida de seguridad si lo tengo abierto de otro lado?
Ademas probando el codigo me dice que dsEdit y dsInsert son variables no definidas (sera porque uso zeoslib?) y la "cantidad" se carga con el valor 1 y no con el valor que le estoy cargando el tedit
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.

Última edición por The Cid James fecha: 20-11-2017 a las 12:11:09.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar resultado de dos campos de una base de datos en un tercer campo ezerusso SQL 8 15-10-2015 09:48:21
Enviar por correo respaldo de una base de datos n03l Varios 9 07-02-2013 23:17:44
Como enviar el resultado de una consulta con un Query al Word? Ricsato Servers 8 28-07-2007 23:52:36
Enviar valores a tabla de una Base de Datos Caray PHP 0 28-03-2007 07:26:50
Operaciones sobre base de datos davidgaldo Conexión con bases de datos 4 31-03-2004 11:50:07


La franja horaria es GMT +2. Ahora son las 00:24:33.


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
Copyright 1996-2007 Club Delphi