Para saber si un registro existe o no, deberías preguntarlo directamente a la base y no recorrer cada registro y comparar.
Esta parte
Código:
//Recorro la tabla de productos con una Query para comprobar que el producto no este ya en la BD
while (!XDatos->QRecorreProductos->Eof)
{
if (XDatos->QRecorreProductosREFERENCIA->Value == StringGrid1->Cells[0][f])
existe = true;
XDatos->QRecorreProductos->Next();
}
Deberías realizarla con un query que te responda si existe o no.
No conozco como hacerlo en C, pero sería algo así:
Código:
// Ejecuto query que cuentas cuantos registros tienen referencia=[lo que busco]
XQueryExisteDato->SQL->Text = 'SELECT COUNT(*) FROM DATOS WHERE REFERECIA='||StringGrid1->Cells[0][f];
XQueryExisteDato->ExecSQL;
// Si existe la cuenta será mayor a 0
if (XQueryExisteDato->FieldByName('COUNT')->Value > 0)
{existe = true;}
Lo mismo deberías hacer en cada caso en el que recorres las tablas con un while.