|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - shackletta
Páginas: [1]
1
« en: Martes 6 de Septiembre de 2005, 12:47 »
Buenos días, tengo una duda, estoy intentando hacer unas gráficas con unos resultados de una consulta que hago sobre una tabla de Access. La gráfica puede tener diferentes valores en los ejes dependiendo de los parámetros de la consulta que elija el usuario. La conexión a la BD la realizo de forma dinámica, por lo que no puedo asignar un datasource a las series de en tiempo de diseño. Quiero hacerlo en tiempo de ejecución, sé cómo pasarle los valores leídos de la BD pero no sé cómo asignar valores a los ejes. A ver si consigo explicarme mejor, los valores que obtengo (de momento) son una cantidad por un año. Personas Año 1589 1996 3451 1997 5581 1998 2000 1999 La idea es que en la gráfica se muestren en el eje X los años y los puntos de la gráfica sean las cantidades correspondientes, pero no sé como pasarle los años al eje X Lo que hago para meter los datos de las cantidades en una serie es: Código: int i = 0; int datos = 0; while (!Data->ADOQuery8->Eof) { Cantidad[i] = Data->ADOQuery8->FieldByName("Cantidad")->AsFloat; i++; datos++; Data->ADOQuery8->Next(); } DBChart1->AddSeries(&TBarSeries(this)); DBChart1->Series[0]->Active = true; for (i=0; i < datos; i++) DBChart1->Series[0]->Add(Cantidad[i],"",clBlue);
Y veo que tanto DBChart como TChart tienen unas propiedades llamadas RightAxis y LeftAxis, y supongo que debe ser ahí donde debo introducir los años, pero no sé como hacerlo. Alguien puede ayudarme??, la verdad es que aunque no quede bien decirlo es urgente, mañana tengo que haberlo conseguido así que agradecería cualquier tipo de información o ayuda. He consultado el manual que hay en la página de grupo albor pero no he encontrado como hacer esto en tiempo de ejecución. Muchas gracias por vuestra colaboración.
2
« en: Miércoles 6 de Julio de 2005, 11:55 »
También puedes hacerlo empleando ADOQuery's y consultas SQL, como SELECT, INSERT, DELETE, UPDATE...
ADOQuery->Close(); ADOQuery->SQL->Clear(); ADOQuery->SQL->Add("SELECT * FROM mitabla"); ADOQuery->SQL->Prepared = true; ADOQuery->SQL->Open();
Con SELECT se utiliza Open, y con el resto se utiliza ExecSQL()
Consejo: Crea un modulo de datos (datamodule) y pon ahí todos los componentes que vayas a utilizar para trabajar con la base de datos.
Accederás a ellos así.
DataModule->ADOQuery->Open(); // Por ejemplo
Ciao, busca por el foro que seguro que hay más cosas sobre esto.
3
« en: Miércoles 6 de Julio de 2005, 11:50 »
Hola, no sé si al utilizar el DataBaseDesktop te hará falta algo más, es que yo no lo utilizo, pero para crear mis ejecutables sin tener que distribuir archivos adicionales o librerías y que funcionen en PC's sin Builder lo que hago es:
En "Project\Options\Packages " desmarcar la opción "Build with runtime packages"
En la pestaña "Projects\Options\Linker" desmarcar las opciones "Use dynamic RTL" y "Use debug libraries"
Después "Build All"
Verás como el nuevo ejecutable es mucho más grande, pero eso es porque ha incorporado todo lo que le hace falta para poder funcionar sin builder.
Pruébalo, así es como me enseñaron a mí hacerlo y me funciona, pero nunca he utilizado el DataBaseDeskotp... prueba, y espero que haya suerte.
4
« en: Jueves 9 de Junio de 2005, 17:49 »
Hola, para posicionarte en el último registro de una tabla tienes los métodos de para las tablas:
-Last()-> Pasa al último registro de la tabla -FindLast()-> Devuelve true si puede pasar al último registro de la tabla
En la ayuda del Builder aparece esto:
FindFirst Move to the first record that matches the current filter criteria. The search for the first matching record always begins at the first record in the unfiltered dataset. FindLast Move to the last record that matches the current filter criteria. FindNext Moves from the current record in the filtered dataset to the next one. FindPrior Move from the current record in the filtered dataset to the previous one.
Lo que pasa es que no sé si es esto lo que necesitas, porque pones "dependiendo de un campo", porque no te explicas un poco más??
Un saludo.
5
« en: Miércoles 8 de Junio de 2005, 21:09 »
Hola, si no me equivoco, que podría ser que sí, deberías utilizar ADOCommand y no ADOTable, y sería así: ADOCommand1->CommandText = "SELECT codigo, nombre FROM Alumno WHERE codigo = :cod" ADOCommand1->Parameters->ParamByName("cod")->Value = variable; ADOCommand1->Execute();
"variable" es una variable en la que tengas almacenado el valor para realizar la consulta, o puedes poner directamente el valor. Lo que pasa es que desconozco el funcionamiento exacto de este componente, sé que es capaz de devolver un recordset, y si quieres que te lo devuelva debes utilizar un ADODataSet independiente Esto es lo que viene en la ayuda del Builder: The Execute method of TADOCommand is, however, capable of returning a recordset. To use that recordset, however, you will need a separate ADO dataset component. Espero que mi ayuda te sirva de algo. Un saludo...
7
« en: Miércoles 1 de Junio de 2005, 09:47 »
Hola Lisnpire, no sé si esto te servirá: http:// Form TransparenteUn saludo...
8
« en: Lunes 30 de Mayo de 2005, 08:46 »
Hola, verás no puedo responder en el mensaje "contar renglones", no me salen las opciones, pero en fin, esa dirección de correo que te dí era correcta, no sé porqué te devolvió el mail. De todas maneras te doy otra diferente, vale? shackletta@hotmail.comMuchas gracias por todo.... Un saludo
9
« en: Domingo 29 de Mayo de 2005, 10:59 »
Muchas gracias Linspire, me lo puedes enviar a shackletta@gmail.com.
10
« en: Sábado 28 de Mayo de 2005, 20:00 »
Podrías explicar cómo lo solucionaste??, por cierto, se puede recorrer un DBGrid por filas y pintarlas según el valor de uno de los datos almacenados?? Gracias
11
« en: Sábado 28 de Mayo de 2005, 19:57 »
Bueno, nadie se anima a contestarme, veréis aún no he podido solucionarlo. Otra cosa que he pensado es crear un simple programa en VB que abra un objeto Access y desde él ejecutar la macro, claro, tendría que ejecutar este exe desde el programa hecho en Builder, pero me parece una solución poco elegante, y claro teniendo en cuenta que lo necesito para mi proyecto final de carrera... En fin, agradecería enormemente que alguien pudiera darme alguna solución. Puedo crear un objeto Access con Builder y acceder a la macro con builder de la misma forma que se puede hacer con VB?? Gracias...
12
« en: Domingo 15 de Mayo de 2005, 13:45 »
Hola a todos,tengo una duda, en mi programa me conecto a una base de datos Access mediante componentes ADO. En dicha base de datos he creado un módulo para importar una hoja de cálculo excel y convertirla en una tabla más de mi base de datos. Para ello he creado un módulo muy simple en VB de la siguiente manera: Public Function ImportarExcel(Hoja As String) DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "Expediente", Hoja, True, "" End Function Lo que quisiera saber es como puedo llamar a este módulo desde el programa en Builder pasándole el parámetro Hoja (el nombre del libro .xls) que elegirá el usuario mediante un OpenDialog. ¿Se puede hacer esto, no?. Es que necesito resolver el problema de este modo para poder terminar mi programa. Muchas gracias por vuestras futuras respuestas.
13
« en: Martes 12 de Abril de 2005, 18:42 »
Hola, creo que en lugar de empezar con i=1; deberías empezar con i=0; ya que en los arrays el primer indice siempre es el 0. Por eso en la última iteración del bucle, en lugar de estar accediendo al último entero del DNI estás accediendo a la letra, y por eso pone result = false.
Espero que sea eso.
Un saludo.
14
« en: Viernes 4 de Febrero de 2005, 19:37 »
Pues supongo que en el evento Onclick del botón buscar puedes poner una query (si la conexión a la BD es con ADO será una ADOQuery) donde busques lo que quieres y te lo devuelva.
Una vez hayas recogido el texto del TEdit (con Edit->Text), lo guardas en un AnsiString (que yo llamaré name), y añades a la Query una sentencia SQL
SELECT id, apellidos, direccion FROM Clientes WHERE nombre = name
eso suponiendo que la búsqueda la realices por nombre.
Después tienes que incluir una línea de código para ejecutar la consulta, Open(), y asociar esa consulta a un DataSet para poder visualizar el resultado después.
Esto es más o menos la teoría, para ver si te aclaro un poco más las cosas te voy a poner un ejemplo pero hecho con la conexión con la BD es con ADO y por ello utilizo ADOQuery:
AnsiString name = Edit1->Text; // es bueno cerra la query primero por si acaso la hubiésemos utilizado en // otra parte del programa y la hubiésemos dejado "abierta" lo que podría // darnos problemas ADOQuery1->Close(); // la limpiamos ADOQuery1->SQL->Clear(); // le añadimos la consulta SQL ADOQuery1->SQL->Add("SELECT id, apellidos,direccion FROM Clientes"); ADOQuery1->SQL->Add("WHERE nombre = name"); // ejecutamos la consulta ADOQuery1->Open();
// Muestro el resultado de la consulta en un DBGrid DataSource1->DataSet = ADOQuery1; DBGrid1->DataSource = DataSource1;
Espero haberte ayudado en algo...
15
« en: Sábado 4 de Diciembre de 2004, 12:08 »
Y porqué no pones un cuadro de diálogo (pestaña Dialogs) en el formulario, y se lo asocias a un botón, o a una opción de un main menu, o a lo que quieras, por ejemplo: void __fastcall TFormMainMenu::Button1Click(TObject *Sender) { //Abro el diálogo para buscar la BD a la que me quiero conectar //le pongo filtro y extensión por defecto para que sólo me //aparezcan bases de datos de ACCESS OpenDialogBD->Filter = "Bases de datos Access (*.mdb)|*.mdb"; //si el usuario elige una BD del diálogo if(OpenDialogBD->Execute()) { // guardo en BDLocal el nombre de la BD elegida por el usuario String nombreBDlocal = OpenDialogBD->FileName; } } Esta es una función muy simple, a la que luego se le podría añadir tratamiento de excepciones (con try{} -catch{}) No sé si esto será lo que realmente quieres, pero creo que es la mejor forma de buscar ficheros. Esta función la hice para BD de Access pero podrías poner cualquier tipo de extensión, utiliza la opción "buscar" en el foro, pon "dialogs" o "diálogos"y seguro que hay varias respuestas. Un saludo.
16
« en: Viernes 3 de Diciembre de 2004, 14:26 »
Tengo que hacer algo similar, pero yo quería hacerlo metiendo la información en un grid, me pondré a investigar e intentaré decirte algo.
Un saludo.
17
« en: Viernes 3 de Diciembre de 2004, 13:57 »
Muchas gracias por la información, lo había resuelto de otra manera pero me has abierto un nuevo camino. Gracias.
18
« en: Miércoles 17 de Noviembre de 2004, 19:19 »
Existe un método de la clase TCustomListView que se llama DeleteSelected, y borra sólo los items seleccionados, y existe también el método Delete, creo que debería utilizarse así:
ListItems->Delete(); o ListItems->DeleteSelected();
De todas maneras, echalé un vistazo a la ayuda del buider que creo que hay algún ejemplo.
Ciao.
19
« en: Miércoles 17 de Noviembre de 2004, 18:24 »
Hola de nuevo, me han surgido otras dudas, a ver, os explico, en mi programa creo la conexión ADO en tiempo de ejecución, he creado un datamodule donde he puesto la ADOConnection, una ADOTable, una ADOQuery, y también un ADODataSet, a estos 3 últimos, les asigno (en ADOConnection->OnConnectComplete) en el parámetro connection la ADOConnection que he creado. Para realizar las consultas, debo hacer algo más? (aparte de escribirlas en la ADOQuery), es decir, tengo que vincular el ADOTable a alguna tabla de mi BD?, cómo puedo mostrar en un listbox las tablas de las que consta mi BD para así poder elegir una?, y si quiero añadir una tabla a mi BD, cómo puedo hacerlo?, porque en mi BD hay una tabla vacía con el nombre de los campos y el formato de estos, y mi idea era mostrarla en una ventana, que el usuario la rellene y luego hacer un "guardar como ...", esto es factible?, es recomendable? Orientadme por favor, porque voy perdidisíma con esto y se me está echando el tiempo encima, a parte de que estoy a punto de caer en una depresión profunda... No sé donde encontrar más información sobre ADO y sobre todos los pasos que debería hacer, o todos los componentes que debería usar.... y no me remitais a la ayuda del builder, porque en este tema no me está solucionando nada, sólo consigue marearme más. Gracias por todo.
20
« en: Martes 16 de Noviembre de 2004, 10:29 »
Muchas gracias, ya he conseguido solucionarlo, he entendido lo que tenía que hacer y ahora funciona perfectamente.... y mi código ha quedado mucho más claro. Lo he hecho todo en la misma funcion, y he quitado la función inicializar(); Un saludo y hasta pronto.
21
« en: Lunes 15 de Noviembre de 2004, 18:46 »
Hola de nuevo, intento realizar una conexión ADO a una BD en access cuyo nombre escoge el usuario desde un diálogo, utilizo el siguiente código: void __fastcall TFormMainMenu::ButtonConectarClick(TObject *Sender) { OpenDialogBD->DefaultExt="MDB"; OpenDialogBD->FileName="*.mdb"; if(OpenDialogBD->Execute()) { // guardo en nombreBDLocal el nombre de la BD elegida por el usuario nombreBDlocal = OpenDialogBD->FileName; Inicializar(nombreBDlocal); } else { ShowMessage("Debe elegir una BD."); } } //--------------------------------------------------------------------------- // FUNCION Inicializar // Realiza la conexión a la BD que el usuario ha elegido del diálogo. Se le // asignan los parámetros correspondientes a la conexión //--------------------------------------------------------------------------- void Inicializar(AnsiString nombre) //llama a esta función pasandole el nombre que se ha cogido desde el dialogo { //Para la conexión con la BD de destino if(DataModule1->ConexionBDlocal->Connected==false) { AnsiString conexion="Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source="; conexion+=nombre; conexion+=";Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";"; conexion+="Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;"; conexion+="Jet OLEDB:Database Locking Mode=2;Jet OLEDB:Global Partial Bulk Ops=2;"; //Por defecto el locking Mode es 1!!!!!!! con 2 no se bloquea..... conexion+="Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";"; conexion+="Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;"; conexion+="Jet OLEDB:Don't Copy Locale on Compact=False;"; conexion+="Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False"; DataModule1->ConexionBDlocal->ConnectionString = conexion; DataModule1->ConexionBDlocal->Connected = true; } } Pero me da una EOleException con el mensaje "No se estableció el valor de una propiedad de sólo lectura ", alguien sabe a que se refiere esto??, la función inicializar debería pertenecer a una clase ¿no?, cómo podría ponerla??, y dónde?? Ambas funciones están en el .cpp del mainform, y nombreBDlocal la he definifo como un AnsiString de manera global también en el mismo .cpp ¿Qué más debería hacer?¿O que no debería hacer? De todas maneras, si alguien puede indicarme otra forma de hacer lo mismo, que me lo diga POR FAVOOOOOR!!! Muchas gracias.
22
« en: Jueves 11 de Noviembre de 2004, 20:25 »
Hola, soy nueva en esto, veréis, estoy desarrollando un proyecto, es la primera vez que utilizo c++ builder, y a pesar de haber programado ya en c++ voy bastante perdida. Os explico un poco, tengo que acceder a una base de datos en access, que el usuario debe seleccionar, para ello he puesto un botón en el form principal que al apretarlo abre un diálogo, una vez he recogido el nombre ¿cómo se lo paso a la ADOConnection?. Por otra parte tengo un main menu en el form principal, en varias de las opciones se abren otros formularios, y desde ahí tengo que trabajar con la base de datos, ¿cómo hago para no tener que establecer una conexión cada vez?, ¿tengo que poner un datamodule en cada nuevo form?, uff, he intentado hacer "usable" el datamodule del form principal en el resto de forms pero no sale. Muchas gracias, leyendo las consultas de vuestro foro he resuelto varias de las otras dudas que tenía, seguro que seguís viéndome por aquí. Ciao.
Páginas: [1]
|
|
|