Sigo liado con esto y ahora he colocado un TEdit el cual me devuelve el total a pagar por el cliente. Si abro una tabla de un cliente me sale el total, si inserto una linea tambien, si elimino una linea tambien.
El problema lo tengo cuando no existia la tabla y la crea, ahi si inserto o elimino algun producto al DBGrid no surte efecto y el total siempre es 0. Si cambio de cliente y vuelvo a abrir el que he creado ya si funciona bien.
Este es el codigo que tengo ahora mismo:
Unit1.cpp:
Código PHP:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ZAbstractDataset"
#pragma link "ZAbstractRODataset"
#pragma link "ZAbstractTable"
#pragma link "ZConnection"
#pragma link "ZDataset"
#pragma resource "*.dfm"
TFormMain *FormMain;
bool bloqueado,abierta;
//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
bloqueado=true;
abierta=false;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ButtonAddConsumisionClick(TObject *Sender)
{
FormProductos->ShowModal();
FormProductos->EditBusqueda->Text = "";
EditTotal->Text=GetTotal(ZQueryClientes,DataSourceClientes,"Precio");
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ButtonSelectClienteClick(TObject *Sender)
{
if(ComboBox1->Text == ""){
Application->MessageBoxA("Debe introducir un nombre de cliente válido.","Atención",MB_OK | MB_ICONINFORMATION);
return;
}
int retval;
ZQueryClientes->Connection = ZConnection;
ZTableClientes->Connection = ZConnection;
ZTableClientes->TableName = ComboBox1->Text;
DataSourceClientes->DataSet = ZTableClientes;
DBGridClientes->DataSource = DataSourceClientes;
AnsiString Cadena_SQL; //Cadena del comando SQL a ejecutar
if(!ZConnection->Connected)
ZConnection->Connect(); //me conecto a la BD
Cadena_SQL = "SELECT * FROM " + ComboBox1->Text;
ZQueryClientes->SQL->Clear(); //se limpia la cadena SQL existente
ZQueryClientes->SQL->Text=Cadena_SQL; //cargo el comando SQL a ejecutar
try{
ZQueryClientes->ExecSQL(); //Ejecuto el comando
}catch(...){
retval = Application->MessageBoxA("El cliente no existe. ¿Desea crearlo?","Atención",MB_YESNO | MB_ICONINFORMATION);
if(retval == IDYES){
Cadena_SQL="CREATE TABLE IF NOT EXISTS \"main\".\"" + ComboBox1->Text + "\" (\"Nombre\" VARCHAR(50),\"Unidades\" REAL,\"Precio\" REAL,\"Total\" REAL)";
ZQueryClientes->SQL->Clear(); //se limpia la cadena SQL existente
ZQueryClientes->SQL->Text=Cadena_SQL; //cargo el comando SQL a ejecutar
ZQueryClientes->ExecSQL(); //Ejecuto el comando
ComboBox1->Items->Add(ComboBox1->Text);
}else{
return;
}
}
//En este punto la tabla ya esta creada por lo tanto ya se puede abrir
//el componente de TABLA
ZTableClientes->Open();
//Ajustamos el ancho de las columnas para que se vean mejor
DBGridClientes->Columns->operator [](0)->Width=250;
DBGridClientes->Columns->operator [](1)->Width=65;
DBGridClientes->Columns->operator [](2)->Width=65;
DBGridClientes->Columns->operator [](3)->Width=65;
ButtonAddConsumision->Enabled = true;
if(!bloqueado){
ButtonDelLine->Enabled = true;
ButtonEliminarCli->Enabled = true;
}
abierta=true;
}
//---------------------------------------------------------------------------
double __fastcall TFormMain::GetTotal(TZQuery *ZQuery, TDataSource *DataSource, char *nombreCol)
{
double Total=0;
ZQuery->DataSource = DataSource;
ZQuery->Open();
ZQuery->First();
while(!ZQuery->Eof){
Total+=ZQuery->FieldByName(nombreCol)->Text.ToDouble();
ZQuery->Next();
}
ZQuery->Close();
return Total;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ButtonEliminarCliClick(TObject *Sender)
{
AnsiString Cadena_SQL; //Cadena del comando SQL a ejecutar
if(!ZConnection->Connected)
ZConnection->Connect();
Cadena_SQL = "DROP TABLE IF EXISTS \"main\".\"" + ComboBox1->Text + "\"";
ZQueryClientes->SQL->Clear(); //se limpia la cadena SQL existente
ZQueryClientes->SQL->Text=Cadena_SQL; //cargo el comando SQL a ejecutar
ZTableClientes->Close();
ZQueryClientes->ExecSQL(); //Ejecuto el comando
DBGridClientes->DataSource = NULL;
for(int i=0;i<ComboBox1->Items->Count;i++)
{
if(ComboBox1->Items->operator [](i)==ComboBox1->Text)
{
ComboBox1->Items->Delete(i);
break;
}
}
ButtonAddConsumision->Enabled = false;
ButtonDelLine->Enabled = false;
ButtonEliminarCli->Enabled = false;
abierta=false;
EditTotal->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ButtonDelLineClick(TObject *Sender)
{
if(!ZTableClientes->IsEmpty()){
ZTableClientes->Delete();
}
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ButtonAdminClick(TObject *Sender)
{
AnsiString cadena;
int result;
if(ButtonAdmin->Caption == "Ir al modo Administrador"){
FormLogin->MaskEdit1->Text="";
result=FormLogin->ShowModal();
if(result==mrOk){
bloqueado=false;
ButtonAdmin->Caption = "Ir al modo Usuario";
if(abierta==true){
ButtonDelLine->Enabled = true;
ButtonEliminarCli->Enabled = true;
}
}else if(result==mrNo){
Application->MessageBoxA("Ha introducido una contraseña incorrecta. No se ha desbloqueado la lista.","Contraseña incorrecta",MB_OK | MB_ICONERROR);
}
}else{
bloqueado=true;
ButtonAdmin->Caption = "Ir al modo Administrador";
ButtonDelLine->Enabled = false;
ButtonEliminarCli->Enabled = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormClose(TObject *Sender, TCloseAction &Action)
{
if(FormProductos->ZQueryProductos->Active)
FormProductos->ZQueryProductos->Close();
if(FormProductos->ZTableProductos->Active)
FormProductos->ZTableProductos->Close();
if(ZQueryClientes->Active)
ZQueryClientes->Close();
if(ZTableClientes->Active)
ZTableClientes->Close();
if(ZConnection->Connected)
ZConnection->Disconnect();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::DataSourceClientesDataChange(TObject *Sender,
TField *Field)
{
EditTotal->Text=GetTotal(ZQueryClientes,DataSourceClientes,"Precio");
}
//---------------------------------------------------------------------------
Unit2.cpp:
Código PHP:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ZAbstractDataset"
#pragma link "ZAbstractRODataset"
#pragma link "ZAbstractTable"
#pragma link "ZDataset"
#pragma link "ZConnection"
#pragma resource "*.dfm"
TFormProductos *FormProductos;
//---------------------------------------------------------------------------
__fastcall TFormProductos::TFormProductos(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormProductos::FormCreate(TObject *Sender)
{
if(!FormMain->ZConnection->Connected)
{
FormMain->ZConnection->Protocol = "sqlite-3";
FormMain->ZConnection->Database = "clientesDB.sqlite";
ZQueryProductos->Connection = FormMain->ZConnection;
ZTableProductos->Connection = FormMain->ZConnection;
ZTableProductos->TableName = "Articulos";
DataSourceProductos->DataSet = ZTableProductos;
DBNavigatorProductos->DataSource = DataSourceProductos;
DBGridProductos->DataSource = DataSourceProductos;
AnsiString Cadena_SQL; //Cadena del comando SQL a ejecutar
FormMain->ZConnection->Connect(); //me conecto a la BD
Cadena_SQL="CREATE TABLE IF NOT EXISTS \"main\".\"Articulos\" (\"Nombre\" VARCHAR(50),\"Precio\" REAL)";
ZQueryProductos->SQL->Clear(); //se limpia la cadena SQL existente
ZQueryProductos->SQL->Text=Cadena_SQL; //cargo el comando SQL a ejecutar
ZQueryProductos->ExecSQL(); //Ejecuto el comando
//En este punto la tabla ya esta creada por lo tanto ya se puede abrir
//el componente de TABLA
ZTableProductos->Open();
//Ajustamos el ancho de las columnas para que se vean mejor
DBGridProductos->Columns->operator [](0)->Width=250;
DBGridProductos->Columns->operator [](1)->Width=60;
}
FormMain->ComboBox1->Items->Clear();
FormMain->ZConnection->GetTableNames("",FormMain->ComboBox1->Items);
for(int i=0;i<FormMain->ComboBox1->Items->Count;i++)
{
if(FormMain->ComboBox1->Items->operator [](i)=="Articulos")
{
FormMain->ComboBox1->Items->Delete(i);
i--;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TFormProductos::DBGridProductosCellClick(TColumn *Column)
{
TDataSet *DS = static_cast<TDataSet*>( DBGridProductos->DataSource->DataSet );
EditNombre->Text = DS->FieldByName("Nombre")->AsString;
EditPrecio->Text = DS->FieldByName("Precio")->AsString;
if ( EditUnidades->Text != "" && EditPrecio->Text != "" )
EditTotal->Text = EditUnidades->Text.ToDouble() * EditPrecio->Text.ToDouble();
}
//---------------------------------------------------------------------------
void __fastcall TFormProductos::EditUnidadesExit(TObject *Sender)
{
if(EditUnidades->Text != "" && EditPrecio->Text != "")
EditTotal->Text = EditUnidades->Text.ToDouble() * EditPrecio->Text.ToDouble();
}
//---------------------------------------------------------------------------
void __fastcall TFormProductos::ButtonDesbloquearClick(TObject *Sender)
{
AnsiString cadena;
int result;
if(ButtonDesbloquear->Caption == "Editar lista")
{
FormLogin->MaskEdit1->Text="";
result=FormLogin->ShowModal();
if(result==mrOk){
DBGridProductos->ReadOnly = false;
DBGridProductos->Options = TDBGridOptions(DBGridProductos->Options) >> dgRowSelect << dgEditing;
DBNavigatorProductos->Enabled = true;
ButtonDesbloquear->Caption = "Proteger lista";
}else if(result==mrNo){
ShowMessage("Contraseña incorrecta. No se ha desbloqueado la lista.");
}
}else{
DBGridProductos->ReadOnly = true;
DBGridProductos->Options = TDBGridOptions(DBGridProductos->Options) << dgRowSelect >> dgEditing;
DBNavigatorProductos->Enabled = false;
ButtonDesbloquear->Caption = "Editar lista";
}
}
//---------------------------------------------------------------------------
void __fastcall TFormProductos::ButtonAddConsumisionClick(TObject *Sender)
{
if(EditNombre->Text !="" && EditPrecio->Text !="" && EditUnidades->Text !="" && EditPrecio->Text !="" && EditUnidades->Text !="")
{
FormMain->ZTableClientes->Insert();
FormMain->ZTableClientes->FieldByName("Nombre")->Text = EditNombre->Text; //se carga el valor de la edad
FormMain->ZTableClientes->FieldByName("Unidades")->Text = EditUnidades->Text.ToDouble();
FormMain->ZTableClientes->FieldByName("Precio")->Text = EditPrecio->Text.ToDouble();
FormMain->ZTableClientes->FieldByName("Total")->Text = EditTotal->Text.ToDouble();
FormMain->ZTableClientes->Post(); //se ejecuta la inserccion
}
}
//---------------------------------------------------------------------------
void __fastcall TFormProductos::EditBusquedaChange(TObject *Sender)
{
ZTableProductos->Filter = "Nombre LIKE '*" + EditBusqueda->Text + "*'";
ZTableProductos->FilterOptions = TFilterOptions(ZQueryProductos->FilterOptions) << foCaseInsensitive;
ZTableProductos->Filtered=(EditBusqueda->Text != "");
}
//---------------------------------------------------------------------------