 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
pablo_emiliob Master


Registrado: 19 Sep 2005Mensajes: 211Ubicación: Barranquilla - Colombia
|
Publicado: Sab 26 Abr, 2008 4:00 pm Asunto: problema con una tabla .dbf |
|
|
HOLA!!!
Resulta que tengo una base de datos en dbase, es decir tengo varias tablas lo cual quiere decir que tengo varios .dbf's...
ahora en una tabla tengo un campo DATE, pero el problema es que cuando quiero agregar una fecha desde el codigo mediante un TQuery me da un error, yo lo agrego asi:
| Código: | AnsiString q="INSERT INTO control VALUES ('"+Edit50->Text+"','"+DateTimePicker4->Date.FormatString("dd/mm/yyyy")+"','"+Label41->Caption+"','"+Edit15->Text+"','"+Label45->Caption+"','"+Memo5->Text+"','"+LowerCase(ComboBox3->Text)+"','"+Edit18->Text+"','"+Edit20->Text+"','"+Edit19->Text+"','0','"+Edit20->Text+"')";
findins(Query5, q); |
el DateTimePicker4 es el que utilizo para eso, pero me bota un error de tabla
en el DateTimePicker le doy de fecha 15/01/2008...
ayudenme porfa
GRACIAS!!! _________________ __________________________
C++ RULZ FO' EVA' |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Lun 28 Abr, 2008 12:34 pm Asunto: |
|
|
Por q guardas todo como String??
incluyendo el Date? deberia ser un campo Date tambien, no? _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 28 Abr, 2008 1:54 pm Asunto: |
|
|
Cuando tengo que hacer operaciones similares a la que quieres hacer, siempre me meuvo con parámetros:
| Código: | AnsiString q="INSERT INTO control VALUES ('"+Edit50->Text + "', :Fecha,'" + Label41->Caption + "','" + Edit15->Text + "','" + Label45->Caption + "','" + Memo5->Text + "','" + LowerCase(ComboBox3->Text) + "','" + Edit18->Text + "','" + Edit20->Text + "','" + Edit19->Text + "','0','" + Edit20->Text + "')"; |
Y en el query:
| Código: | Query->Close();
Query->SQL-Text = q;
Query->ParamByName("Fecha")->AsDateTIme = DateTimePIcker1->Date;
Query->ExecSQL(); |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Ultima edición por Angel el Mar 29 Abr, 2008 12:54 pm, editado 1 vez |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Lun 28 Abr, 2008 2:13 pm Asunto: |
|
|
Yo tambein trabajo como dice Angel como en C++ o en Java, es mucho mas organizado. _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
pablo_emiliob Master


Registrado: 19 Sep 2005Mensajes: 211Ubicación: Barranquilla - Colombia
|
Publicado: Lun 28 Abr, 2008 3:23 pm Asunto: |
|
|
la pregunta del millon es la siguiente, ahi donde dices que pasas el parametro fecha, solamente pasa la fecha o la fecha y la hora??...
aunque tenga esa pregunta probare y les dire...
GRACIAS!!! _________________ __________________________
C++ RULZ FO' EVA' |
|
| Volver arriba |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Lun 28 Abr, 2008 3:56 pm Asunto: |
|
|
Aparte del metodo que te propone Angel (que alguna vez tambien lo he usado yo), si deseas probar con lo que estabas haciendo al principio, cambiale el formato a mm/dd/yyyy, creo que es el mas usual, salvo mysql que es yyyy/mm/dd.
Por otra cosa que te puede fallar es que no te cuadren los valores con sus tipos en la tabla.
Una vez cuadran los valores nunca da problemas. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 28 Abr, 2008 7:45 pm Asunto: |
|
|
| pablo_emiliob escribió: | | la pregunta del millon es la siguiente, ahi donde dices que pasas el parametro fecha, solamente pasa la fecha o la fecha y la hora??... |
Si pones DateTimePicker1->Date pasas la fecha y si pones Time pasas la hora. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 29 Abr, 2008 7:05 am Asunto: Re: problema con una tabla .dbf |
|
|
| pablo_emiliob escribió: | | Código: | AnsiString q="INSERT INTO control VALUES ('"+Edit50->Text+"','"+DateTimePicker4->Date.FormatString("dd/mm/yyyy")+"','"+Label41->Caption+"','"+Edit15->Text+"','"+Label45->Caption+"','"+Memo5->Text+"','"+LowerCase(ComboBox3->Text)+"','"+Edit18->Text+"','"+Edit20->Text+"','"+Edit19->Text+"','0','"+Edit20->Text+"')";
findins(Query5, q); |
|
Yo te diría más aun: Usa parámetros para todos los campos del query, pero teniendo cuidado como te dice juanma con los tipos de datos para evitar errores. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Mar 29 Abr, 2008 12:36 pm Asunto: |
|
|
Viendo todo en realidad no ddeberia haber ningun problema ya que es una inserccion sencilla.
Solo mira la estrucctura de tu DB y que no tenga incongruencias con lo parametros q pasas! _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
pablo_emiliob Master


Registrado: 19 Sep 2005Mensajes: 211Ubicación: Barranquilla - Colombia
|
Publicado: Mar 29 Abr, 2008 7:32 pm Asunto: |
|
|
ahi te mando la estructura de la tabla control de mi DB, a mi parecer es sencilla... no se que se tendria que configurar...
 _________________ __________________________
C++ RULZ FO' EVA' |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 30 Abr, 2008 9:05 am Asunto: |
|
|
Veo otra cosa en el AnsiString en que almacenas el query: Imagino que estás usando un elemento TQuery; si es así el nombre de la tabla debe ir entre apóstrofos e indicando la extensión ('control.dbf').
En serio, usa el sistema de parámetros en todo el insert; es la forma de que el sistema asigne los formatos adecuados, y así no te hace falta FormaString ni nada: Cuando se encuentra una fecha, como es tu caso, le da lo mismo si la entrada está en formato europeo o americano porque sabe que cosa va en cada sitio. Yo lo dejaría así:
| Código: | Query1->Close();
Query1->SQL->Text = "INSERT INTO 'control.dbf' VALUES(:CONSEC, :FECHA, :IDCLIENTE, :NOMCLIENTE, :TELEFONO, :DESCRIPCIO, :SERVICIO, :GRUPO, :VALOR, :VALORGRUP, '0', :VALORPAGA)";
Query1->ParamByName("CONSEC")->AsString = Edit50->Text;
Query1->ParamByName("FECHA")->AsDateTime = DateTimePicker4->Date;
Query1->ParamByName("IDCLIENTE")->AsString = Label41->Caption;
Query1->ParamByName("NOMCLIENTE")->AsString = Edit15->Text;
Query1->ParamByName("TELEFONO")->AsString = Label45->Caption;
Query1->ParamByName("DESCRIPCIO")->AsString = Memo5->Text;
Query1->ParamByName("SERVICIO")->AsString = LowerCase(ComboBox3->Text);
Query1->ParamByName("GRUPO")->AsString = Edit18->Text;
Query1->ParamByName("VALOR")->AsString = Edit20->Text;
Query1->ParamByName("VALORGRUP")->AsString = Edit19->Text;
Query1->ParamByName("VALORPAGA")->AsString = Edit20->Text;
Query->ExecSQL(); |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Mie 30 Abr, 2008 10:48 am Asunto: |
|
|
Creo q en estos dos ultimos mensajes tienes la respuesta, por un lado el insert que haces es muy sencillo y en lo que te puede fallar en el filtrado de caracteres (por ejemplo la ' no puede estar en ningun edit por decir alguno) tambien veo que entre los edit hay un memo que es posible que te este metiendo el caracter extrano que origine el error.
Si el filtrado de caracteres no lo tienes controlado, debes de usar el método que te recomienda angel ya que lleva implicito un filtrado de caracteres.
Saludos,
Juanma |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 30 Abr, 2008 11:26 am Asunto: |
|
|
Lo que te dice juanma sorbe los carácteres, a demás, es correctísimo. En el caso concreto del campo en que usas el TMemo (DESCRIPCIO), en la tabla deberías definirlo de la misma forma que en el formulario, indicando que es un Memo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
pablo_emiliob Master


Registrado: 19 Sep 2005Mensajes: 211Ubicación: Barranquilla - Colombia
|
Publicado: Mie 30 Abr, 2008 7:41 pm Asunto: |
|
|
es verdad, ya tengo la respuesta, y me funciona. La cuestion ahora es el ahorramiento de codigo y cuando digo eso me refiero a que yo ya tenia unas funciones predeterminadas las cuales me hacian el insert o el select, solamente le pasaba el TQuery y el string con la consulta. Estas son:
| Código: | void findcon(TQuery *q, AnsiString cons)
{AnsiString consulta=cons;
q->Close();
q->SQL->Clear();
q->SQL->Add(consulta);
q->Open();
}
void findins(TQuery *q, AnsiString cons)
{AnsiString consulta=cons;
q->Close();
q->SQL->Clear();
q->SQL->Add(consulta);
q->ExecSQL();
q->Close();
}
|
Findcon es para consultar y findins es para insertar
Ahora con eso de los parametros no se como hacerlo para que sea asi de comodo, simplemente llamando las funciones.
Si tienen alguna idea haganmelo saber...
GRACIAS!!! _________________ __________________________
C++ RULZ FO' EVA' |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 02 May, 2008 7:23 am Asunto: |
|
|
No se me había planteado nunca un problema similar, porque yo no llamo a funciones para ejecutar los querys. Se me ocurre que podrías pasar los valores en un TStringList; en este caso, además tendrías que pasar por referencia el TStringLIst:
Sólo tendrías que tener cuidado de una cosa: el primer índice de los TStringList debe ir al primer parámetro, etc. Luego, con un bucle for vas reemplazando los parámetros por el valor. Adaptando el código que viene en la ayuda de ParamCount:
| Código: | void findcon(TQuery *q, AnsiString cons, TStringList slValor)
{
q->Close();
q->SQL->Add(cons);
for (int nParam = 0; nParam <q>ParamCount; nParam ++)
{
TParam *pParam = q->Params->Items[nParam];
switch (pParam->DataType)
{
case ftString:
pParam->AsString = slValor[nParam;
brek;
case ftInteger:
pParam->AsInteger = StrToInt(slValor[nItem]);
break;
...
}
}
}
//---------------------------------------------------------------------- |
No hace falta que crees esa variable consulta para el código del query; al ser un AnsiString puedes usar directamente la declaración de la función.
Una forma que uso yo para los querys está explicada en Ideas sobre un programita, en el cuarto mensaje. Es rutina la uso bastante y me funciona muy bien. No va por el lado de los parámetros, pero a lo mejor te sirve de pista. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|