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 

Registro Como TVarRec

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Registro Como TVarRec Responder citando

bien, el objetivo, es pasar el contenido de una tabla, a otra, pero desconociendo, la estructura de la primera..
bien, el primer paso es copiar la estructura de la primera que no se conce de la siguiente manera, (problema resuelto),
Código:
this->IBQuery1->Close();      // query con la estructura de la tabla
    this->IBQuery1->Open();       //
    this->kbmMemTable1->FieldDefs->Clear();// limpiamos la tabla
    for(int a=0;a<this->IBQuery1->FieldCount;a++){ //checamos lo campos
        this->kbmMemTable1->FieldDefs->Add(     //SE AGREGAN a la base tmp
            this->IBQuery1->Fields->Fields[a]->FieldName,
            this->IBQuery1->Fields->Fields[a]->DataType,
            this->IBQuery1->Fields->Fields[a]->Size,
            false
        );
    }
    this->kbmMemTable1->Open();// y se habre la base

Bien el problema se encuentra, cuando quiero agregar el contenido de la tabla.

Código:
      this->IBQuery1->First();
    while(!this->IBQuery1->Eof){
        //<EL ERROR, SE ENCUENTRA AQUI>

        this->kbmMemTable1->AppendRecord(//<como pasar un registro> dela
                                         //Query1, pero utilizando
                                         // AppendRecord
                                        );
        this->IBQuery1->Next();
    }

bien he intentado con BatchMove, pero como la tabla (kbmMemTable1), es un componente, y no trae esta propiedad... no puedo utilizarlo
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola César, ¿Exactamente para que quieres copiar el contenido en otra tabla?

Si más no recuerdo el componente que mencionas es para tener en una tabla temporal una copia de los datos de tu IBQuery. Permiteme recomendarte usar mejor el componente TIBClientDataSet este combina en un solo paquete un TIBQuery, un TDataSetProvider y un TClientDataSet, su uso es simple:

1) Creas un objeto TIBTransaction llamado "TransCDS" con su propiedad AutoStopAction = saCommit, y en DefaultDataBase = <Tu TIBDataBase>

2) Creas un objeto TIBClientDataSet( el últomo componente de la Pestaña Interbase en el Builder ) y lo llamas "cdsXXX" y en su propiedad DBTransaction = transCDS, luego en su propiedad CommandText escribes tu sentencia SQL de consulta por ejemplo

Código:
Select  * from tabla where Campo1 = :Parametro1 order by campo1
o
Select * from ProcedimientoAlmacenado( :Parametro1, :Parametro2, ...) order by campo1

Luego solo harias :
Código:
cdsXXX->Open();

y automaticamente el componente consigue los datos, gestiona automáticamente la apertura y cierre de la trasacción y ya puedes usarlo como si fuese tu tabla temporal, puedes recorrerlo, guardarlo a un fichero:
Código:
cdsXXX->SaveToFile("c:\\Datos.cds);

o recuperarlos
Código:
cdsXXX->LoadFromFile("c:\\Datos.cds);

Puedes aplicar filtros mucho mas efectivos que en un DataSet Normal
Código:
cdsXXX->Filter = "Campo1 is null";
ó
cdsXXX->Filter = "Campo2 in ( 123, 34, 13 )";
ó
cdsXXX->Filter = "year(campoFecha) = 2003";

Tienes los campos calculados y los campos calculados internos( los cuales nos permiten crear indices sobre ellos ), tienes ademas los campos Agregados los cuales no trabajan en un registro como los otros sino en el integro de la tabla permitien crear un campo que puede por ejemplo totalizar una columna o hallar el promedio de otra. En la propiedad expreesion de un campo Agregado podrias poner cosas como:
Código:
Expresion = "sum(Campo1)";
ó
Expresion = "sum(Campo1)*max(Campo2)";
ó
Expresion = "avg(Campo1*Campo2-100)";
Ahora con los TIBClientDataSet puedes manipular sus datos, modificarlos, insertar nuevos, borrar otros y no se reflejara nada en el servidor ya que estas trabajando con una copia local, y si al final deseas enviarlos al servidor deberas incluir la siguiente línea:
Código:
cdsXXX->ApplyUpdates(0);

Deberas incluir la librería midas.dll en el directorio de tu Ejecutable cuando vayas a distribuir tu programa.

Me olvidaba, si no tuvieses el componente TIBClientDataSet o el Objeto TIBTransaction no tuviese la propiedad AutoStopAction debes busca una actualización del paquete IBX el cual se hallará en la pagina de Borland. tambien busca en este foro sobre IBX , Interbase o coloca TSQL (es una clase que hice para encapsular el manejo del sql del interbase dentro del builder ) .

Espero haberte ayudado Razz
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

nada es cuestionable, lo unico que deseo es devolver todo un Registro Como TVarRec, Independientemente si lo asigno a una tabla o se manipula en un TStringGrid,

Es todo, solo quiero saber si se puede o no. para intentar otras opciones..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

No se manejar el TVarRec, pero tengo una función que devolvia el registro en un array de Variants tal vez puedas cambiarla para tu propósito:
Código:
void __fastcall CopiarRegistro(TDataSet * Tabla, Variant * Lista)
{
  int  NroCampos;
  NroCampos = Tabla->Fields->Count;
  if( Lista )
    delete Lista;
  Lista = new Variant[NroCampos];
  // Recordamos los campos
  for(int x = 0; x < NroCampos; x++)
    Lista[x] = Tabla->Fields->Fields[x]->AsVariant;
}

uso
Código:
{
  Variant * Registro;
  CopiarRegistro(tbClientes,Registro);
  // tu proceso
  int x = Registro[0]->AsInteger;//Primer campo

  delete Registro;
 }
Volver arriba
Ver perfil de usuario Enviar mensaje privado
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.