PDA

Ver la Versión Completa : tquery a archivo


ralmic
10-02-2014, 23:49:02
Hola estimados, necesito pasar los datos de un tquery a un archivo de texto o csv para después agregar estos datos a una tabla igual que se encuentra en otra base de datos, ya hice las conexiones. mi base de datos es sybase 9, y trabajo en c++ xe3, intente migrarlo con sql incrustado en c++ usando la opción output de sybase pero me da un error que esta mala la sentencia. lo pruebo en el isql y me importa el archivo sin problemas. gracias de antemano.

ecfisa
11-02-2014, 00:31:41
Hola ralmic.


void QueryToTxt(TQuery *qy, const String aFileName)
{
String tmp;

TStrings *sl = new TStringList;
__try {
qy->Close();
qy->Open();
while (!qy->Eof) {
tmp = "";
for(int i=0; i<qy->Fields->Count; i++)
tmp += qy->Fields->Fields[i]->AsString + ",";
tmp.SetLength(tmp.Length()-1);
sl->Add(tmp);
qy->Next();
}
qy->Close();
sl->SaveToFile(aFileName);
} __finally {
delete sl;
}
}


Ejemplo de uso:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->SQL->Text = "SELECT * FROM COUNTRY";
QueryToTxt(Query1, "C:\\Carpeta\\Query.txt");
}


Saludos :)

ralmic
11-02-2014, 15:15:37
Gracias había hecho un código parecido, no andaba tan perdido, ahora para agregar esos datos a la tabla, como hacer para que a las cadenas, fechas y demas les ponga comillas y asi poder agregarlos o este código es suficientemente inteligente y hace eso??

ecfisa
11-02-2014, 16:17:50
Hola ralmic.

La función que hice no agrega comillas, pero con un simple cambio podes indicarle el formato que deseas:

void QueryToTxt(TQuery *qy, const String aFileName, const String Quote)
{
String tmp;

TStrings *sl = new TStringList;
__try {
qy->Close();
qy->Open();
while (!qy->Eof) {
tmp = "";
for(int i=0; i<qy->Fields->Count; i++)
tmp += Format("%s%s%s,", ARRAYOFCONST(((String)Quote,
(String)qy->Fields->Fields[i]->AsString, (String)Quote)));
tmp.SetLength(tmp.Length()-1);
sl->Add(tmp);
qy->Next();
}
qy->Close();
sl->SaveToFile(aFileName);
} __finally {
delete sl;
}
}


Ejemplo:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
...
// Sin comillas
QueryToTxt(Query1, "C:\\Pruebas\\NoQuote.txt","");

// Con comillas simples
QueryToTxt(Query1, "C:\\Pruebas\\SingleQuote.txt",'\'');

// Con comillas dobles
QueryToTxt(Query1, "C:\\Pruebas\\DoubleQuote.txt",'"');
}


Saludos :)

ralmic
11-02-2014, 17:11:16
gracias es excelente tu código, realmente quise modificarlo para mis necesidades soy un poco novato en builder y parece que no hay mucha ayuda. con este método le pone comilla a todo no importa que sea carácter o no lo que me faltaría es como pornerle comillas a los valores que no sean numéricos. para poder a agregarlos a un a tabla. será posible?? . saludos.

ecfisa
11-02-2014, 18:21:54
Hola ralmic.
...
lo que me faltaría es como pornerle comillas a los valores que no sean numéricos. para poder a agregarlos a un a tabla. será posible?? ...


Si claro,

void QueryToTxt(TQuery *qy, const String aFileName, const String Quote)
{
String tmp;
TStrings *sl = new TStringList;

__try {
qy->Close();
qy->Open();
while (!qy->Eof) {
tmp = "";
for(int i=0; i<qy->Fields->Count; i++)
tmp += qy->Fields->Fields[i]->InheritsFrom(__classid(TNumericField)) ?
qy->Fields->Fields[i]->AsString + "," :
Quote+qy->Fields->Fields[i]->AsString+Quote + ",";
tmp.SetLength(tmp.Length()-1);
sl->Add(tmp);
qy->Next();
}
qy->Close();
sl->SaveToFile(aFileName);
} __finally {
delete sl;
}
}


Uso:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
QueryToTxt(Query1, "C:\\Pruebas\\DoubleQuote.txt",'"');
}


Saludos :)