DataProvider Dinamico
Bom Dia pessoal.
Estou com o seguinte problema será que alguem pode me ajudar ?
Tenho um sistema em Delphi 7/dbExpress, banco de Dados SQL Server.
O sistema trabalha em cima de um dicionario de dados para geração das telas. é criada a tabela no banco configurado o dicionário e o Delphi gera a Tela em tempo de execução sem precissar construir a tela.
O problema é o seguinte.
Tenho um trecho de código para construção das tabelas Detail do Form:
var
DsGenT, DsGen: TSQLDataSet;
Select: TStringList;
LinhaCampo: String;
TamD, Tam: Integer;
begin
Select:= TStringList.Create;
DsGenT:= TDinQuery.cmdSQL_Ds(´select d.tabela_detalhe from i_tabdel d where d.tabela = ´ + chr(39) + FTabela + chr(39) +
´ order by tabela´, FConexao);
DsGenT.First;
while not DsGenT.Eof do
begin
Select.Clear;
TamD:= Length(FTabDetail);
SetLength(FTabDetail, TamD+1);
DsGen:= TDinQuery.cmdSQL_Ds(´select * from i_tabcpo where tabela = ´ + chr(39) + DsGenT.Fields[0].AsString + chr(39) +
´ order by linha, ordem_linha´, FConexao);
DsGen.First;
repeat
LinhaCampo:= DsGen.FindField(´campo´).AsString;
Tam:= Length(FTabDetail[TamD].FCampos);
Setlength(FTabDetail[TamD].FCampos, Tam+1);
FTabDetail[TamD].FCampos[Tam].Campo := DsGen.FindField(´campo´ ).AsString;
FTabDetail[TamD].FCampos[Tam].Linha := DsGen.FindField(´linha´ ).AsInteger;
FTabDetail[TamD].FCampos[Tam].Ordem := DsGen.FindField(´ordem_linha´).AsInteger;
FTabDetail[TamD].FCampos[Tam].Comprimento:= DsGen.FindField(´comprimento´).AsInteger;
FTabDetail[TamD].FCampos[Tam].Rotulo := DsGen.FindField(´rotulo´ ).AsString;
FTabDetail[TamD].FCampos[Tam].Lookup := DsGen.FindField(´lookup´ ).AsString;
FTabDetail[TamD].FCampos[Tam].TabLookup := DsGen.FindField(´tab_lookup´ ).AsString;
DsGen.Next;
if not DsGen.Eof then
LinhaCampo:= LinhaCampo + ´,´;
Select.Add( LinhaCampo );
until DsGen.Eof;
Select.Add(´from ´ + DsGen.Fields[0].AsString);
FTabDetail[TamD].FDataSet:= TSQLDataSet.Create(nil);
FTabDetail[TamD].FDataSet.Name := ´DSDet´ + DsGenT.Fields[0].AsString;
FTabDetail[TamD].FDataSet.SQLConnection:= FConexao;
FTabDetail[TamD].FDataSet.CommandText := Select.Text;
FTabDetail[TamD].FProvider:= TDataSetProvider.Create(nil);
FTabDetail[TamD].FProvider.Name := ´PDet´ + DsGenT.Fields[0].AsString;
FTabDetail[TamD].FProvider.DataSet:= FTabDetail[TamD].FDataSet;
FTabDetail[TamD].FClienteDS:= TClientDataSet.Create(nil);
FTabDetail[TamD].FClienteDS.Name := ´TDet´ + DsGenT.Fields[0].AsString;
[b:86fdc31c4d]FTabDetail[TamD].FClienteDS.ProviderName := FTabDetail[TamD].FProvider.Name;[/b:86fdc31c4d]
FTabDetail[TamD].FClienteDS.MasterSource := DSTabelaG;
FTabDetail[TamD].FClienteDS.MasterFields := ClientDataSet1.Fields[0].FieldName;
FTabDetail[TamD].FClienteDS.IndexFieldNames:= ClientDataSet1.Fields[0].FieldName;
FTabDetail[TamD].FDataSource:= TDataSource.Create(nil);
FTabDetail[TamD].FDataSource.Name := ´DSourceDet´ + DsGenT.Fields[0].AsString;
FTabDetail[TamD].FDataSource.DataSet:= FTabDetail[TamD].FClienteDS;
DsGenT.Next;
end;
E um trecho que cria uma grid para esta tabela:
var
Tam, i: Integer;
Aba: TTabSheet;
begin
for i:= Low(FTabDetail) to High(FTabDetail) do
begin
Aba:= TTabSheet.Create(nil);
Aba.PageControl:= PageControl1;
Aba.Caption := ´Teste´;
Aba.Parent := PageControl1;
Tam:= Length(FDBGrids);
SetLength(FDBGrids, Tam+1);
FDBGrids[Tam]:= TDBGrid.Create(nil);;
FDBGrids[Tam].DataSource:= FTabDetail[i].FDataSource;
FDBGrids[Tam].Align := alClient;
FDBGrids[Tam].Parent:= Aba;
PageControl1.InsertComponent(Aba);
ShowMessage(FTabDetail[i].FClienteDS.ProviderName);
FTabDetail[i].FClienteDS.Open;
end;
Porém ao abrir o ClientDataSet a seguinte menssagem ocorre: Missing Data Provider or Data pachet.
Porém a propriedade ProviderName do ClientDataSet esta preenchida Corretamente.
Alguém Tem uma ídeia do que pode ser ?
Valeu.
Estou com o seguinte problema será que alguem pode me ajudar ?
Tenho um sistema em Delphi 7/dbExpress, banco de Dados SQL Server.
O sistema trabalha em cima de um dicionario de dados para geração das telas. é criada a tabela no banco configurado o dicionário e o Delphi gera a Tela em tempo de execução sem precissar construir a tela.
O problema é o seguinte.
Tenho um trecho de código para construção das tabelas Detail do Form:
var
DsGenT, DsGen: TSQLDataSet;
Select: TStringList;
LinhaCampo: String;
TamD, Tam: Integer;
begin
Select:= TStringList.Create;
DsGenT:= TDinQuery.cmdSQL_Ds(´select d.tabela_detalhe from i_tabdel d where d.tabela = ´ + chr(39) + FTabela + chr(39) +
´ order by tabela´, FConexao);
DsGenT.First;
while not DsGenT.Eof do
begin
Select.Clear;
TamD:= Length(FTabDetail);
SetLength(FTabDetail, TamD+1);
DsGen:= TDinQuery.cmdSQL_Ds(´select * from i_tabcpo where tabela = ´ + chr(39) + DsGenT.Fields[0].AsString + chr(39) +
´ order by linha, ordem_linha´, FConexao);
DsGen.First;
repeat
LinhaCampo:= DsGen.FindField(´campo´).AsString;
Tam:= Length(FTabDetail[TamD].FCampos);
Setlength(FTabDetail[TamD].FCampos, Tam+1);
FTabDetail[TamD].FCampos[Tam].Campo := DsGen.FindField(´campo´ ).AsString;
FTabDetail[TamD].FCampos[Tam].Linha := DsGen.FindField(´linha´ ).AsInteger;
FTabDetail[TamD].FCampos[Tam].Ordem := DsGen.FindField(´ordem_linha´).AsInteger;
FTabDetail[TamD].FCampos[Tam].Comprimento:= DsGen.FindField(´comprimento´).AsInteger;
FTabDetail[TamD].FCampos[Tam].Rotulo := DsGen.FindField(´rotulo´ ).AsString;
FTabDetail[TamD].FCampos[Tam].Lookup := DsGen.FindField(´lookup´ ).AsString;
FTabDetail[TamD].FCampos[Tam].TabLookup := DsGen.FindField(´tab_lookup´ ).AsString;
DsGen.Next;
if not DsGen.Eof then
LinhaCampo:= LinhaCampo + ´,´;
Select.Add( LinhaCampo );
until DsGen.Eof;
Select.Add(´from ´ + DsGen.Fields[0].AsString);
FTabDetail[TamD].FDataSet:= TSQLDataSet.Create(nil);
FTabDetail[TamD].FDataSet.Name := ´DSDet´ + DsGenT.Fields[0].AsString;
FTabDetail[TamD].FDataSet.SQLConnection:= FConexao;
FTabDetail[TamD].FDataSet.CommandText := Select.Text;
FTabDetail[TamD].FProvider:= TDataSetProvider.Create(nil);
FTabDetail[TamD].FProvider.Name := ´PDet´ + DsGenT.Fields[0].AsString;
FTabDetail[TamD].FProvider.DataSet:= FTabDetail[TamD].FDataSet;
FTabDetail[TamD].FClienteDS:= TClientDataSet.Create(nil);
FTabDetail[TamD].FClienteDS.Name := ´TDet´ + DsGenT.Fields[0].AsString;
[b:86fdc31c4d]FTabDetail[TamD].FClienteDS.ProviderName := FTabDetail[TamD].FProvider.Name;[/b:86fdc31c4d]
FTabDetail[TamD].FClienteDS.MasterSource := DSTabelaG;
FTabDetail[TamD].FClienteDS.MasterFields := ClientDataSet1.Fields[0].FieldName;
FTabDetail[TamD].FClienteDS.IndexFieldNames:= ClientDataSet1.Fields[0].FieldName;
FTabDetail[TamD].FDataSource:= TDataSource.Create(nil);
FTabDetail[TamD].FDataSource.Name := ´DSourceDet´ + DsGenT.Fields[0].AsString;
FTabDetail[TamD].FDataSource.DataSet:= FTabDetail[TamD].FClienteDS;
DsGenT.Next;
end;
E um trecho que cria uma grid para esta tabela:
var
Tam, i: Integer;
Aba: TTabSheet;
begin
for i:= Low(FTabDetail) to High(FTabDetail) do
begin
Aba:= TTabSheet.Create(nil);
Aba.PageControl:= PageControl1;
Aba.Caption := ´Teste´;
Aba.Parent := PageControl1;
Tam:= Length(FDBGrids);
SetLength(FDBGrids, Tam+1);
FDBGrids[Tam]:= TDBGrid.Create(nil);;
FDBGrids[Tam].DataSource:= FTabDetail[i].FDataSource;
FDBGrids[Tam].Align := alClient;
FDBGrids[Tam].Parent:= Aba;
PageControl1.InsertComponent(Aba);
ShowMessage(FTabDetail[i].FClienteDS.ProviderName);
FTabDetail[i].FClienteDS.Open;
end;
Porém ao abrir o ClientDataSet a seguinte menssagem ocorre: Missing Data Provider or Data pachet.
Porém a propriedade ProviderName do ClientDataSet esta preenchida Corretamente.
Alguém Tem uma ídeia do que pode ser ?
Valeu.
Igor_grava
Curtidas 0
Respostas
N
14/10/2007
Utilize a procedure SetProvider(ComponenteProvider);
GOSTEI 0
Marco Salles
14/10/2007
Utilize a procedure SetProvider(ComponenteProvider);
isto mesmo , porém vehja o que diz o Helph do Delph
If the provider has the same Owner as the client dataset, you can also use the ProviderName property
Se o provedor tem o mesmo proprietário como o conjunto de dados do cliente, você também pode usar a propriedade ProviderName.
No seu código
FTabDetail[TamD].FProvider:= TDataSetProvider.Create(nil);
FTabDetail[TamD].FClienteDS:= TClientDataSet.Create(nil);
Troque por
FTabDetail[TamD].FProvider:= TDataSetProvider.Create(Sel);
FTabDetail[TamD].FClienteDS:= TClientDataSet.Create(Self);
ps) Não estou dizendo que o SetProvider não irá resolver , so estou dizendo o porque de não funcionar o
FTabDetail[TamD].FClienteDS.ProviderName ... E para utilkizar o ProviderName o Proprietário do ClientDataSer e do
DataSetProvider tem que ser iguais ....
espero ter sido claro
[]sds
GOSTEI 0