Hola. A ver si alguno es capaz de decirme donde está el error en el código porque yo llevo dos horas dando vueltas y no soy capaz de verlo. Perdonad si el código es un poco pesado.
Tengo una aplicación en BCB 6 que monta un query por código:
Código PHP:
fPersona->Query->Close();
switch ((nItem = Mensaje(2, "Hay " + FormatFloat("###,##0", fPersona->Auxiliar->Fields->FieldByNumber(1)->AsInteger) + " recibos " +
LowerCase(RadioGroup1->Items->Strings[RadioGroup1->ItemIndex]) + " pendientes de emitir. Seleccione acción", cAux)))
{
case 1:
dFecha = dFcargo;
if (RadioGroup1->ItemIndex == 0)
{
fCalendar->Fecha->MinDate = EncodeDate(1977, 5, 5);
fCalendar->Fecha->MaxDate = DiaHabil(IncMonth(Date(), 12));
fCalendar->Fecha->Date = DiaHabil(Date());
fCalendar->ShowModal();
if ((int)fCalendar->Fecha->Date == dFechaNula)
{
Mensaje(4, "Cancelado por el usuario", "Volver");
FormCreate(NULL);
return;
}
dFecha = (int)fCalendar->Fecha->Date;
fCalendar->Fecha->Date = DiaHabil((int)Date());
fCalendar->Fecha->MinDate = DiaHabil((int)Date());
fCalendar->Fecha->MaxDate = DiaHabil((int)Date() + 3);
}
fPersona->Query->SQL->Text = "UPDATE Emision SET Fecha = :Fecha, RefInt = :NewRef";
fPersona->Query->ParamByName("Fecha")->AsDateTime = dFecha;
fPersona->Query->ParamByName("NewRef")->AsString = dFecha.FormatString("'1'yyyymmdd");
break;
case 2:
fPersona->Query->SQL->Text = "DELETE FROM Emision";
break;
case 3:
Application->CreateForm(__classid(TfVerRec), &fVerRec);
fVerRec->Label1->Caption = "";
fVerRec->Label2->Caption = "";
fVerRec->Tag = 2;
fPersona->Query->SQL->Text = "SELECT Apellidos||', '||Nombre, Referencia, Nif, Codigo, Texto, Importe FROM Rc01 WHERE RefInt LIKE :RefInt ORDER BY 1, 2, 3, 4";
fPersona->Query->ParamByName("RefInt")->AsString = FormatFloat("0'%'", RadioGroup1->ItemIndex + 1);
fPersona->Query->Open();
for (; !fPersona->Query->Eof; fPersona->Query->Next())
{
pItem = fVerRec->LisRec->Items->Add();
pItem->Caption = fPersona->Query->Fields->FieldByNumber(1)->AsString;
if (!fPersona->Query->FieldByName("Referencia")->AsString.IsEmpty())
pItem->SubItems->Add(fPersona->Query->FieldByName("Referencia")->AsString);
else if (!fPersona->Query->FieldByName("Nif")->AsString.IsEmpty())
pItem->SubItems->Add(fPersona->Query->FieldByName("Nif")->AsString);
else
pItem->SubItems->Add(fPersona->Query->FieldByName("Codigo")->AsInteger);
pItem->SubItems->Add(fPersona->Query->FieldByName("Texto")->AsString);
pItem->SubItems->Add(FormatFloat("##,##0.00 €", fPersona->Query->FieldByName("Importe")->AsFloat));
pItem->SubItems->Add(fPersona->Query->FieldByName("Codigo")->AsInteger);
}
fVerRec->ShowModal();
cAux = "";
for (nItem = 0; nItem < fVerRec->LisRec->Items->Count; nItem ++)
if (fVerRec->LisRec->Items->Item[nItem]->Checked)
cAux = cAux + fVerRec->LisRec->Items->Item[nItem]->SubItems->Strings[3] + ", ";
cAux = cAux.SubString(1, cAux.LastDelimiter(",") - 1);
delete fVerRec;
break;
case 4:
FormCreate(NULL);
return;
}
if (nItem == 3 && cAux.IsEmpty())
return;
try
{
fPersona->Query->SQL->Add("WHERE RefInt LIKE :RefInt");
fPersona->Auxiliar->ParamByName("RefInt")->AsString = FormatFloat("0'%'", RadioGroup1->ItemIndex + 1);
if (nItem == 3)
{
if (cAux.Pos(",") == 0)
fPersona->Query->SQL->Add("AND Codigo = " + cAux);
else
fPersona->Query->SQL->Add("AND Codigo IN (" + cAux + ")");
}
fPersona->Query->ExecSQL();
fPersona->Query->Transaction->Commit();
}
catch(...)
{
fPersona->Query->Transaction->Rollback();
cAux = nItem != 1 ? "el borrado" : "la actualización";
Mensaje(1, "Ha habido un error en " + cAux + " de los recibos pendientes.\r\nInténtelo de nuevo.", "Volver");
FormCreate(NULL);
return;
}
Todas las funciones, formularios y variables están definidas y funcionan a la perfección. Con ese código pueden montarse dos tipos de query:
Uno de actualización que quedaría así por ejemplo:
Código SQL
[-]UPDATE Emision SET Fecha = :Fecha, RefInt = :NewRef WHERE RefInt LIKE :RefInt
y otro de borrado que podría ser este:
Código SQL
[-]DELETE FROM Emision WHERE RefInt LIKE :RefInt
Los parámetros
NewRef y
RefInt se componen de un dígito del 1 al 4 y una fecha en formato yyyymmdd y en la tabla sobre la que se trabaja no puede haber dos campos RefInt que comiencen, por ejmplo, por 1 y tengan fechas distintas.
Si la variable dFecha toma el valor 15/02/2018 y ese Radiogroup1->ItemIndex valiera 0, los parámetros quedaría así:
- Sólo para la actualización:
Fecha = 15/02/2018
NewRef = 120180215
Pues con esos datos y tal cual está el código si ejecuto el programa no me hace nada (ni borra ni actualiza), pero si con el código tal cual se genera me voy a SQL Manager y lo pruebo hace exactamente lo que debiera. ¿Se os ocurre cuál puede ser la causa?