Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

problema con una tabla .dbf
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: problema con una tabla .dbf Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Re: problema con una tabla .dbf Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.