Angel.Matilla |
21-02-2018 11:14:00 |
UPDATE / DELETE: En programa no funciona, en SQL Manager sí
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?
|