PDA

Ver la Versión Completa : Sugerencias, informacion...Access + Alias


alt126
01-12-2004, 11:20:08
Hola, antetodo un saludo a todos. Hace tiempo ya estuve en este mismo foro, pero al final por falta de tiempo deje de usarlo :o . Ahora vuelvo con algunas dudas, espero que me ayudeis...empiezo:

Estoy haciendo una aplicacion con builder c++ 3, pero para el caso es lo mismo que delphi 4. Tengo que conectar a una base de datos access, que para 1 ordenador estara en modo local y para el resto en red.

La aplicacion en modo local ya esta hecha... :rolleyes: mis problemas son los siguientes:

1º - Para realizar la instalacion de la aplicacion, estoy usando el InnoSetup 4, y funciona estupendamente, pero mi primer problema son los alias. Yo creo un alias desde codigo con

Session->AddStandardAlias("nombrealias", "path", "Microsoft Access Driver (*.mdb)");

y la cosa es que se queda almacenado el alias en el BDE, pero al intentar abrir alguna tabla o Database...nada, me dice que

Invalid configuration parameter

he comparado el alias creado por codigo con uno creado manualmente desde el BDE Administrator, y la unica diferencia es un campo ODBC DSN, pero desde codigo no se como incluir ese campo. Ademas, al crear el alias por codigo, no indico por ningun lado cual es la base de datos en cuestion, solo el path...asi que si alguien me explica un poco o me ayuda....mil gracias

2º - Mi segundo problema es todavia teorico pero bueno, quiero que al instalar me pueda preguntar si lo que quiero instalar va a ser para acceder a la BD en modo local o modo remoto, para asi poder crear supuestamente un alias u otro...como puedo hacer esto? y es posible crear un alias para una BD en red por codigo?

3º - Por ultimo y por ahora, jejeje, estoy usando un Database, tables y querys...con eso en modo local no tengo ningun problema, es decir, puedo acceder a BD locales y remotas, pero esto es suficiente o seria mejor usar algun otro componente para cliente/servidor o alguna cosa asi mas compleja?

Gracias a todos y por todo,

Antonio :)

alt126
03-12-2004, 10:06:29
:confused: Vamos a ver...para empezar solo busco como crear una conexion (alias) mediante codigo, para conectar a una base de datos access.

Tengo mi aplicacion y mi base de datos, y quiero conectarme a la base de datos pero desde codigo. Supongo que sera con el objeto Session que tiene la aplicacion por defecto. Yo intento hacerlo con AddStandarAlias(...) pero no funciona y supongo que es porque no le indico exctamente donde esta la BD...pero como puedo hacer eso?

Gracias...:)

alt126
09-12-2004, 11:33:56
Para quien le pueda interesar y tuviera el mismo problema que yo ;) ...he encontrado un programita llamado ISTool, que permite crear scripts para el inno setup y asi crear alias, entradas a registro...de manera automatica introduciendo unos parametros :eek: ...una de las opciones es crear ODBC que es lo que yo estaba necesitando, :confused: yaque el alias no me servia, asi que ahora ya estoy sin problemas...:D

Adios,

PD.- Si alguien necesita algo mas de informacion que me lo diga...

davezf
04-01-2005, 13:53:41
Hola alt126,

yo estoy en un caso parecido al tuyo, solo que me conecto a access por ADO.

Podrias indicarme como cambias el alias con la aplicacion istool en funcion de si

es local o no?

alt126
05-01-2005, 12:11:44
Vamos a ver...mas que con el IsTool, lo que yo he hecho fue con el "Inno Setup Form Designer 1.1.2c", que te permite hacer formularios para incluirlos en la instalacion. Asi que lo que hice fue, crear un formulario donde preguntaba si la instalacion era local o remota. Si era local el alias lo instalaba con un path y si era remota con otro.

Asi que la respuesta se puede dividir en varias partes:

- primero como hacer para seleccionar entre local o remoto -> yo use ese programa.

- segundo como crear el alias -> se hace creando unas entradas al registro desde el inno setup.

Como no se si todo esto te aclara algo o no...te dejo aki el codigo...(un poco largo y lioso, te lo advierto!!!).

Si te aclara algo, mira concretamente las partes del registro y del codigo, pero ojo, la mayor parte del codigo de la parte codigo la genera el programa ese para crear forms.

Aqui tienes:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
[Setup]
AppName=Facturas 1.0
AppVerName=Facturas 1.0
DefaultDirName={pf}\Facturas
DisableDirPage=yes
DefaultGroupName=Facturas
DisableProgramGroupPage=yes
[Tasks]
; NOTE: The following entry contains English phrases ("Create a desktop icon" and "Additional icons"). You are free to translate them into another language if required.
Name: "desktopicon"; Description: "Crear un acceso en el escritorio"; GroupDescription: " "; Flags: unchecked
[Files]
Source: "C:\a\Facturacion.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\Manual de usuario.doc"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\ayuda.ico"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\Manual de instalacion.doc"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\vclx35.bpl"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\borlndmm.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\cp3240mt.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\qrpt35.bpl"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\vcl35.bpl"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\vcldb35.bpl"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\a\MiniReg.exe"; DestDir: "{app}"; Flags: deleteafterinstall
Source: "C:\a\BdeInst.dll"; DestDir: "{app}"; Flags: deleteafterinstall
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\Manual de Usuario"; Filename: "{app}\Manual de Usuario.doc"; IconFilename: "{app}\ayuda.ico"
Name: "{group}\Manual de Instalación"; Filename: "{app}\Manual de Instalacion.doc"; IconFilename: "{app}\ayuda.ico"
Name: "{group}\Facturas"; Filename: "{app}\Facturacion.exe";
; NOTE: The following entry contains an English phrase ("Uninstall"). You are free to translate it into another language if required.
Name: "{group}\Desinstalar Facturas"; Filename: "{uninstallexe}"
Name: "{userdesktop}\Facturas"; Filename: "{app}\Facturacion.exe"; Tasks: desktopicon
[Run]
; NOTE: The following entry contains an English phrase ("Launch"). You are free to translate it into another language if required.
Filename: "{app}\MiniReg.exe"; Parameters: """{app}\BdeInst.dll"""
Filename: "{app}\Facturacion.exe"; Description: "Ejecutar Facturas"; Flags: nowait postinstall skipifsilent
[Registry]
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\ODBC Data Sources; ValueType: string; ValueName: BaseDatosFacturas; ValueData: Microsoft Access Driver (*.mdb); Flags: createvalueifdoesntexist uninsdeletevalue
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: Driver; ValueType: string; ValueData: C:\WINDOWS\System32\odbcjt32.dll
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: DBQ; ValueType: string; ValueData: "{code:RutaAlias|a}"
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: DriverId; ValueType: dword; ValueData: 25
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: FIL; ValueType: string; ValueData: MS Access
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: SafeTransactions; ValueType: dword; ValueData: 0
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: UID; ValueType: string; ValueData:
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas\Engines\Jet; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: ImplicitCommitSync; ValueType: string; ValueData:
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas\Engines\Jet; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: MaxBufferSize; ValueType: dword; ValueData: 2048
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas\Engines\Jet; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: PageTimeout; ValueType: dword; ValueData: 5
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas\Engines\Jet; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: Threads; ValueType: dword; ValueData: 3
Root: HKCU; SubKey: Software\ODBC\ODBC.INI\BaseDatosFacturas\Engines\Jet; Flags: createvalueifdoesntexist uninsdeletevalue; ValueName: UserCommitSync; ValueType: string; ValueData: no


[Code]
var
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Label1: TLabel;
FolderTreeView1: TFolderTreeView;
ruta: String;
function InitializeSetup(): Boolean;
var
Acc97Path: String;

begin
Result := true;
//Solo si access existe.
if(not RegKeyExists(HKLM,'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE')) then
begin
Result := False;
MsgBox('Se requiere que Microsoft Access este instalado' #13#13 'La instalación no puede continuar', mbError, MB_OK);
end;
if(not RegKeyExists(HKLM,'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Excel.EXE')) then
begin
Result := False;
MsgBox('Se requiere que Microsoft Excel este instalado' #13#13 'La instalación no puede continuar', mbError, MB_OK);
end;
if(RegQueryStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Office\8.0','', Acc97Path)) then
begin
Result := False;
MsgBox('Se requiere una version de Microsoft Access 2000 o superior' #13#13 'La instalación no puede continuar', mbError, MB_OK);
end;
end;
procedure LocalOnClick(Sender: TObject);
begin
ruta:='c:\BaseDatos.mdb';
end;
procedure NuevaRutaOnClick(Sender: TObject);
begin
ruta:=FolderTreeView1.Directory + 'BaseDatos.mdb';
end;
procedure RemotoOnClick(Sender: TObject);
begin
RadioButton1.Visible:=false;
RadioButton2.Visible:=false;
ScriptDlgPageSetCaption('Instalación en Red');
ScriptDlgPageSetSubCaption1('Seleccione donde esta ubicada la base de datos');
ScriptDlgPageSetSubCaption2('');
{ Label1 }
Label1 := TLabel.Create(WizardForm.ScriptDlgPanel);
with Label1 do
begin
Parent := WizardForm.ScriptDlgPanel;
Left := 10;
Top := 10;
Width := 182;
Height := 13;
Caption := 'Seleccione la ruta a la base de datos:';
end;
{ FolderTreeView1 }
FolderTreeView1 := TFolderTreeView.Create(WizardForm.ScriptDlgPanel);
with FolderTreeView1 do
begin
Parent := WizardForm.ScriptDlgPanel;
Left := 30;
Top := 30;
Width := 350;
Height := 180;
Cursor := crArrow;
TabOrder := 0;
OnChange := @NuevaRutaOnClick;
end;
end;

function ScriptDlgPages(CurPage: Integer; BackClicked: Boolean): Boolean;
var
Next, NextOK: Boolean;
CurSubPage: Integer;
begin
{ place subpages between 'Welcome'- and 'SelectDir' page }
if (not BackClicked and (CurPage = wpWelcome)) or (BackClicked and (CurPage = wpSelectDir)) then
begin
{ find startpage }
if not BackClicked then
CurSubPage := 0
else
CurSubPage := 1;
{ iterate through all subpages }
while (CurSubPage >= 0) and (CurSubPage <= 1) and not Terminated do
begin
ScriptDlgPageOpen();
ScriptDlgPageClearCustom();
{ insert subpage }
case CurSubPage of
0: // custompage 1
begin
ScriptDlgPageSetCaption('Tipo de Instalación');
ScriptDlgPageSetSubCaption1('Seleccione donde esta ubicada la base de datos');
ScriptDlgPageSetSubCaption2('');
{ RadioButton1 }
RadioButton1 := TRadioButton.Create(WizardForm.ScriptDlgPanel);
with RadioButton1 do
begin
Parent := WizardForm.ScriptDlgPanel;
Left := 32;
Top := 56;
Width := 369;
Height := 17;
Caption := 'Instalación Local (La base de datos esta en este ordenador)';
TabOrder := 0;
OnClick := @LocalOnClick;
end;
{ RadioButton2 }
RadioButton2 := TRadioButton.Create(WizardForm.ScriptDlgPanel);
with RadioButton2 do
begin
Parent := WizardForm.ScriptDlgPanel;
Left := 32;
Top := 80;
Width := 369;
Height := 17;
Caption := 'Instalación Remota (La base de datos esta en otro ordenador)';
TabOrder := 1;
OnClick := @RemotoOnClick;
end;

Next := ScriptDlgPageProcessCustom();
NextOK := True;
end;
1: // custompage n
begin
end;
end;
{ check sub-page navigation }
if Next then
begin
if NextOK then
CurSubPage := CurSubPage + 1;
end
else
CurSubPage := CurSubPage - 1;
end;
{ check main-page navigation }
if not BackClicked then
Result := Next
else
Result := not Next;
ScriptDlgPageClose(not Result);
end
{ return default }
else
Result := True;
end;
{ NextButtonClick }
function NextButtonClick(CurPage: Integer): Boolean;
begin
Result := ScriptDlgPages(CurPage, False);
end;
{ BackButtonClick }
function BackButtonClick(CurPage: Integer): Boolean;
begin
Result := ScriptDlgPages(CurPage, True);
end;

function RutaAlias(S: String): String;
begin
Result := ruta;
end;

davezf
05-01-2005, 13:40:37
Muchas gracias, lo probaré ...

Con el "Inno Setup Form Designer 1.1.2c" puedes hacer que cuando seleccionas
local o remoto, a parte de cambiar el path del alias, se copien o no algunos
archivo de la instalacion?

Por ejemplo, si la instalacion es local, copio la base de datos y si es un cliente
ya no necesito copiarla...

alt126
07-01-2005, 10:28:29
con el "inno setup form designer..." puedes hacer los formularios graficamente, pero no la funcionalidad...esa la tienes que implementar tu a codigo. Supongo que si, que si podras, que en el evento de captura de cuando selecciones un tipo de instalacion local o no, copiar una cosa u otra...aunque eso no lo he hecho. De todos modos, tienes 3 tipos de instalacion que puedes seleccionar y que te permiten copiar unas cosas o no...son full, tipical y custom...pero creo que se pueden crear otras nuevas. entonces podrias crear una local y otra red, y segun la que se seleccione copiar una cosa u otra. prueba eso con el "script make form designer" creo que se llama asi, hay tienes muchas opciones para configurar tu instalador...

suerte...

Antonio

davezf
08-01-2005, 01:21:46
Gracias por la informacion alt126, con eso soluciono el problema, lo probaré.