- open daNexus.pas and find the method implementation for TdanxSession.GetTableNames.
- the TdanxSession.GetTableNames method is calling TnxDatabase.GetTableNames to get the list of available table names. If there is another similar call that can get the list of View names, then try adding some code to this method. If that works, then post the mods here and we can add them for the next release. (I do not have NexusDB installed).
Best regards,
Nard Moseley Digital Metaphors www.digital-metaphors.com
- Limit your code mods to the daNexus.pas unit. It is isolated to Nexus and will not affect any other database connectivity. Perhaps make a copy of the unit and then play with it.
- TnxQuery is being used by the daNexus plugin. (I searched daNexus.pas and TnxTable is never used.)
- Trace the RB Source starting at the method TdaMetaData.GetFieldsFromDataSet. That method will create an instance of the TdanxDataSet class. Put a break point in TdanxDataSet .SetDataName and TdanxDataSet.SetActive.
// this line will create an instance of the TdanxDataSet lDataSet := FSession.CreateDataSet(Self, FDatabaseName);
// this line will resul in a call to TdanxDataSet.SetDataName // the dataname is the name of a table (or view in your case) lDataSet.DataName := aMetaTable.SQLName;
// this line will result in a call to TdansDataSet.SetActive lDataSet.Active := True;
Best regards,
Nard Moseley Digital Metaphors www.digital-metaphors.com
here is the DADE mod for accessing nexusDB v2 views.
note that the associated TnxDatabase cannot be set to "readonly" for a TnxQuery to query a view (not sure why)
cheers Ron
//=========================================================== procedure TdanxSession.GetTableNames(const aDatabaseName: string; aList: TStrings); var lDatabase: TnxDatabase; lQuery: TnxQuery; begin
{get the database} lDatabase := TnxDatabase(GetDatabaseForName(aDatabaseName)); {Database must be active to get table names} lDatabase.Connected := True;
{get list of table names from a table object} if lDatabase.Connected then begin lDatabase.GetTableNames(aList); end;
{get list of view names from a query object} if (lDatabase.Connected) and (lDatabase.ReadOnly = False) then begin {create a temporary NexusDB query} lQuery := TnxQuery.Create(Self); try {assign databae and SQL properties} lQuery.Database := lDatabase; lQuery.SQL.Text := 'select VIEW_NAME from #views';
{set query to active} lQuery.Active := True; lQuery.First;
{append the view name to the list of tables} while lQuery.EOF=false do begin aList.Append(lQuery.Fields[0].AsString); lQuery.Next; end; finally lQuery.Free; end; end;
Thanks for providing that code. We can add this to the daNexus.pas source code. Are most developers that use Nexus, using Nexus v2? Is there a a predefined IFDEF that we can put around the code so that it will be included only when v2 is present?
Best regards,
Nard Moseley Digital Metaphors www.digital-metaphors.com
//================================================================== procedure TdanxSession.GetTableNames(const aDatabaseName: string; aList: TStrings); var lDatabase: TnxDatabase; lQuery: TnxQuery; begin
{get the database} lDatabase := TnxDatabase(GetDatabaseForName(aDatabaseName)); {Database must be active to get table names} lDatabase.Connected := True;
{get list of table names from a table object} if lDatabase.Connected then begin lDatabase.GetTableNames(aList); end;
{$IFDEF NEXUS2} {get list of view names from a query object} if (lDatabase.Connected) and (lDatabase.ReadOnly = False) then begin {create a temporary NexusDB query} lQuery := TnxQuery.Create(Self); try {assign databae and SQL properties} lQuery.Database := lDatabase; lQuery.SQL.Text := 'select VIEW_NAME from #views';
{set query to active} lQuery.Active := True; lQuery.First;
{append the view name to the list of tables..} while lQuery.EOF=false do begin aList.Append(lQuery.Fields[0].AsString); lQuery.Next; end; finally lQuery.Free; end; end; {$ENDIF}
Comments
- open daNexus.pas and find the method implementation for
TdanxSession.GetTableNames.
- the TdanxSession.GetTableNames method is calling
TnxDatabase.GetTableNames to get the list of available table names. If there
is another similar call that can get the list of View names, then try adding
some code to this method. If that works, then post the mods here and we can
add them for the next release. (I do not have NexusDB installed).
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
Not as simple as that unfortunately, and I'm getting a bit out of my depth
Modifying daNexus.pas is simple to have the view listed as a table.
Getting the field list is another story
TdaMetaData.GetFieldsFromDataSet: Unable to open dataset: CCV_CASE_90
I'm gettin a little concerned that playing with this code will
upset reporting from the other databases I use (oracle, SQLserver).
would this have anything to do with TnxTable not being able to see nexusDB
views ??
(only accessible via Tnxquery)
Ron
D7, nexusDB 2.05.5, RB9.02
- Limit your code mods to the daNexus.pas unit. It is isolated to Nexus and
will not affect any other database connectivity. Perhaps make a copy of the
unit and then play with it.
- TnxQuery is being used by the daNexus plugin. (I searched daNexus.pas and
TnxTable is never used.)
- Trace the RB Source starting at the method
TdaMetaData.GetFieldsFromDataSet. That method will create an instance of the
TdanxDataSet class. Put a break point in TdanxDataSet .SetDataName and
TdanxDataSet.SetActive.
// this line will create an instance of the TdanxDataSet
lDataSet := FSession.CreateDataSet(Self, FDatabaseName);
// this line will resul in a call to TdanxDataSet.SetDataName
// the dataname is the name of a table (or view in your case)
lDataSet.DataName := aMetaTable.SQLName;
// this line will result in a call to TdansDataSet.SetActive
lDataSet.Active := True;
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
I'll have a play
here is the DADE mod for accessing nexusDB v2 views.
note that the associated TnxDatabase cannot be set to "readonly" for a
TnxQuery to query a view (not sure why)
cheers
Ron
//===========================================================
procedure TdanxSession.GetTableNames(const aDatabaseName: string; aList:
TStrings);
var
lDatabase: TnxDatabase;
lQuery: TnxQuery;
begin
{get the database}
lDatabase := TnxDatabase(GetDatabaseForName(aDatabaseName));
{Database must be active to get table names}
lDatabase.Connected := True;
{get list of table names from a table object}
if lDatabase.Connected then
begin
lDatabase.GetTableNames(aList);
end;
{get list of view names from a query object}
if (lDatabase.Connected) and (lDatabase.ReadOnly = False) then
begin
{create a temporary NexusDB query}
lQuery := TnxQuery.Create(Self);
try
{assign databae and SQL properties}
lQuery.Database := lDatabase;
lQuery.SQL.Text := 'select VIEW_NAME from #views';
{set query to active}
lQuery.Active := True;
lQuery.First;
{append the view name to the list of tables}
while lQuery.EOF=false do
begin
aList.Append(lQuery.Fields[0].AsString);
lQuery.Next;
end;
finally
lQuery.Free;
end;
end;
end;
Thanks for providing that code. We can add this to the daNexus.pas source
code. Are most developers that use Nexus, using Nexus v2? Is there a a
predefined IFDEF that we can put around the code so that it will be included
only when v2 is present?
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
cheers
//==================================================================
procedure TdanxSession.GetTableNames(const aDatabaseName: string; aList:
TStrings);
var
lDatabase: TnxDatabase;
lQuery: TnxQuery;
begin
{get the database}
lDatabase := TnxDatabase(GetDatabaseForName(aDatabaseName));
{Database must be active to get table names}
lDatabase.Connected := True;
{get list of table names from a table object}
if lDatabase.Connected then
begin
lDatabase.GetTableNames(aList);
end;
{$IFDEF NEXUS2}
{get list of view names from a query object}
if (lDatabase.Connected) and (lDatabase.ReadOnly = False) then
begin
{create a temporary NexusDB query}
lQuery := TnxQuery.Create(Self);
try
{assign databae and SQL properties}
lQuery.Database := lDatabase;
lQuery.SQL.Text := 'select VIEW_NAME from #views';
{set query to active}
lQuery.Active := True;
lQuery.First;
{append the view name to the list of tables..}
while lQuery.EOF=false do
begin
aList.Append(lQuery.Fields[0].AsString);
lQuery.Next;
end;
finally
lQuery.Free;
end;
end;
{$ENDIF}
//===================================================================