Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Multiplos acessos ao mesmo registro


cobbra

Pergunta

Olá...

:blink:

Tenho um número de registros específicos que não mudam, 300, nem são acrescentados e/ou retirados, somente modificados, e cerca de 30 usuários que vão acessar estes dados e alterar campos específicos de cada registro.

Cada campo deste registro tem dados variáveis, como por exemplo número de pessoas, nome do representante deste local, etc.

Quando um usuário acessa, ele irá alterar um dos campos do registro, conforme ele consiga os dados. que podem em determinado momento, e vai acontecer, ser o mesmo registro que outro usuário está alterando.

Mas preciso salvar somente aquele campo alterado sem sobscrever os outros campos não alterados. Tentei usar o Delta do ClienteDataSet, mas não sei como faze-lo salvar somente o campo alterado. Estes dados serão acessados via web, em Mysql. É através do ProviderFlags?

Não posso bloquear o registro para outro usuário, tenho que deixar aberto e salvar somente o campo alterado. Não posso criar uma conexão persistente pois dependendo da localidade o usuário não terá internet, e talvez tenha que salvar em XML...

Alguma dica? Alguém já passou por isso? alguém tem um exemplo para analisar??

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

Cara, desde já, obrigado pela resposta e disposição em ajudar. Passei 2 dias procurando isso, e em outro fórum, nem mesmo fui educamente respondido. Está de parabéns pela educação e disposição. De fato pensei nisso que você propos também.

Na ordem, eu puxo os dados do banco de dados de uma só vez e converto tudo para xml. Isso para que possa ser usado em local sem acesso a internet.

Pensei em gerar um XML somente com os dados alterados. Li a respeito do Delta do ClienteDataSet, inclusive no livro do Marco Cantu.

Com o Delta é possível fazer isso? Jogar por exemplo somente os dados alterados em um novo xml e depois lança-los quando possível no banco de dados?

To apanhando nisso, se fosse somente gravar um novo registro seria simples, o problema é jogar isso tudo outra vez para o banco de dados, sem alterar os campos dos registros originais, somente os atualizados. Não sei se estou sendo claro.

É como alterar somente o peso de uma pessoa em um registro, os outros dados não precisam ser alterados, pois outra pessoa está alterando somente o campo idade deste mesmo registro... um exemplo....

Tem alguma sugestão? Um exemplo possível para eu visualizar?

não sei se existe forma mais simples, mas uma delas, seria você verificar quais os campos alterados e fazer o comando update na mão:

'update TABELA set CAMPO = :pDADO';

assim, você só vai salvar o campo que foi alterado, porém, deverá fazer tudo na mão !!!

abraços !!!

Desde já, obrigado ao Fórum, pela educação e disposição em responder. Estão de Parabéns e isto estimula a ajudar também. Em breve posso enviar algumas dicas sobre google maps, que são úteis usando o delphi.

Obrigado...

Editado por cobbra
Link para o comentário
Compartilhar em outros sites

  • 0
Cobra, sobre XML este assunto me interessou, onde conseguir informações a respeito?
Amigo, alguns sites podem te dar as dicas necessárias, (só não sei se é permitido postar endereços de outros sites):

Acho que este é um bom caminho, divindo em 3 partes - mais recomendado para aprender:

http://imasters.uol.com.br/artigo/1340/dot...lphi_-_parte_1/

http://imasters.uol.com.br/artigo/1383/del...lphi_-_parte_2/

http://imasters.uol.com.br/artigo/1459/del...lphi_-_parte_3/

Outro mais enxuto... menos completo:

http://www.planetadelphi.com.br/dica/6996/...o-xml-no-delphi

E uma vídeo aula, mas precisa ser cadastrado no site:

http://www.activedelphi.com.br/modules.php...cle&sid=233

------------------------------------------

Também o exemplo zipado do amigo Jhonas vai lhe ajudar a ver na prática...

Se precisar de mais material, pesquise no Google - "Criando um Cadastro em XML no Delphi" você encontrará outras vídeo aulas também.

não sei se existe forma mais simples, mas uma delas, seria você verificar quais os campos alterados e fazer o comando update na mão:

'update TABELA set CAMPO = :pDADO';

assim, você só vai salvar o campo que foi alterado, porém, deverá fazer tudo na mão !!!

abraços !!!

Bem, sobre atualizar somente os campos, é uma solução, mas no caso seria complicado, pois teria que fazer uma requisição ao banco diretamente a cada alteração de campo. Mas em alguns locais onde será usada esta aplicação não terá acesso a internet. Haverá necessidade de uma sincronização posterior.

Alguém sabe como fazer o armazenamento das alterações do Delta do ClienteDataSet para alterar posteriormente somente os campos dos registros alterados?

Salvar em XML por exemplo os dados alterados e puxar isso depois para o banco de dados?

Pensei em algo como salvar as alterações em um XML separado, e depois verificar quais campos estão limpos e só jogar o que tivesse conteúdo.

Neste caso teria que receber estes dados alterados do Delta. Se alguém souber de algo assim....

Ainda não achei uma solução mais ajustada a este problema.

Editado por cobbra
Link para o comentário
Compartilhar em outros sites

  • 0

Alguém sabe como fazer o armazenamento das alterações do Delta do ClienteDataSet para alterar posteriormente somente os campos dos registros alterados?

Salvar em XML por exemplo os dados alterados e puxar isso depois para o banco de dados?

Exemplo bem simples:

componentes usados

DBGrid1: TDBGrid;

DBGrid2: TDBGrid;

Query1: TQuery;

DataSetProvider1: TDataSetProvider;

ClientDataSet1: TClientDataSet;

DataSource1: TDataSource;

ClientDataSet2: TClientDataSet;

DataSource2: TDataSource;

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBClient, Provider, DBTables, Grids, DBGrids, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    Query1: TQuery;
    DataSetProvider1: TDataSetProvider;
    ClientDataSet1: TClientDataSet;
    DataSource1: TDataSource;

    ClientDataSet2: TClientDataSet;
    DataSource2: TDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
   clientdataset2.Data := ClientDataSet1.Delta;
   clientdataset2.SaveToFile('c:\teste.xml');
end;

end.

OBS: O clientdataset2 receberá somente os registros com os campos modificados e será gerado o arquivo XML somente com os campos modificados no clientdataset1

exemplo do arquivo XML gerado com apenas um campo modificado ( RUA )

<?xml version="1.0" standalone="yes" ?>

- <DATAPACKET Version="2.0">

- <METADATA>

- <FIELDS>

<FIELD attrname="COD" fieldtype="r8" />

<FIELD attrname="PESSOA" fieldtype="string" WIDTH="8" />

<FIELD attrname="DATA" fieldtype="date" />

<FIELD attrname="NOME" fieldtype="string" WIDTH="60" />

<FIELD attrname="RUA" fieldtype="string" WIDTH="45" />

<FIELD attrname="BAIRRO" fieldtype="string" WIDTH="25" />

<FIELD attrname="CIDADE" fieldtype="string" WIDTH="40" />

<FIELD attrname="UF" fieldtype="string" WIDTH="2" />

<FIELD attrname="CEP" fieldtype="string" WIDTH="10" />

<FIELD attrname="TELRES" fieldtype="string" WIDTH="20" />

<FIELD attrname="TELCOM" fieldtype="string" WIDTH="20" />

<FIELD attrname="CPF" fieldtype="string" WIDTH="20" />

<FIELD attrname="RG" fieldtype="string" WIDTH="15" />

<FIELD attrname="CONTATO" fieldtype="string" WIDTH="40" />

<FIELD attrname="EMAIL" fieldtype="string" WIDTH="40" />

</FIELDS>

<PARAMS DATASET_DELTA="1" LCID="2057" />

</METADATA>

- <ROWDATA>

<ROW RowState="1" COD="37" PESSOA="Juridica" DATA="20001030" NOME="FACULDADES METROPOLITANAS UNIDAS" RUA="RUA TAGUA, 150" BAIRRO="CENTRO" CIDADE="são PAULO" UF="SP" CPF="51.023.289/0001-13" />

<ROW RowState="8" RUA="RUA ITAGUA, 150" />

</ROWDATA>

</DATAPACKET>

Observe que o unico campo alterado foi o nome da RUA ... acho que o resto voce sabe fazer

ClientDataSet possui dois estados internos.

ClientDataSet. Data: contém os dados originais

ClientDataSet. Delta: contém os dados que sofreram alteração

A peristência na verdade é realizada pelo DataSetProvider de acordo com seu UpdateMode e com as configurações dos ProviderFlags. Tanto o Data quanto o Delta são OleVariants, desta forma você pode criar um array de variants e atribuir o valor, ou utilizar um outro ClientDataSet.Data em tempo de execução.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, excelente... B)

Vou olhar aqui e testar, e passo um feedback.

Serão 3 processos para o XML alterado e 2 para chegada ao banco:

Importar Mysql e Salvar em XML-> Alterar XML -> Salvar XML do Delta Alterado --->> Processo de Alteração Finalizado.

Puxar dados do XML alterado e Salvar em MySQL diretamente.... Processo de Sincronização do BD ok.

Ótimo, vou avaliar aqui e já mando um retorno... obrigado!!

Uma pergunta: onde posso deixar alguma dica sobre uso do Google Maps, e disponibilizar para a Comunidade do Fórum?

Aqui a gente encontra informação, mas deixa informação também.

Valeu, e mando um retorno, e se tudo ok, posto aqui e deixo como resolvido o Tópico.

Link para o comentário
Compartilhar em outros sites

  • 0
Mas agora pintou outro problema. Como resolver o problema de econding em utf-8?

Voce está usando palavras acentuadas ???

Sim e no outro componente do banco de dados ele aceita isso e joga isso em xml numa boa.. porém o ClientDataSet não aceita..

Vi algumas coisas sobre isso, e vi que ele tem a opção de utf-8, mas ele não abre o xml que tenho aqui.

Talvez seja mais fácil fazer uma rotina de exportar o banco de dados em xml num padrão mais compatível com o ClientDataSet, ou achar um componente mais atual para isso.

O que você recomenda?

Desculpe a demora para testar a dica acima, estava em plena mudança, ai não foi possível testar. Obrigado Jhonas, a idéia é boa, mas ainda estou travando na ida e vinda dos dados do banco de dados e na conversão disso em xml. Valeu pela ajuda até aqui.

Editado por cobbra
Link para o comentário
Compartilhar em outros sites

  • 0
Mas agora pintou outro problema. Como resolver o problema de econding em utf-8?
Uma maneira muito simples de contornar esse problema seria trocar a primeira linha do XML

<?xml version="1.0" standalone="yes" ?>

por esta

<?xml version="1.0" encoding="utf-8" ?>

- <DATAPACKET Version="2.0">

- <METADATA>

- <FIELDS>

<FIELD attrname="COD" fieldtype="r8" />

<FIELD attrname="PESSOA" fieldtype="string" WIDTH="8" />

<FIELD attrname="DATA" fieldtype="date" />

<FIELD attrname="NOME" fieldtype="string" WIDTH="60" />

<FIELD attrname="RUA" fieldtype="string" WIDTH="45" />

<FIELD attrname="BAIRRO" fieldtype="string" WIDTH="25" />

<FIELD attrname="CIDADE" fieldtype="string" WIDTH="40" />

<FIELD attrname="UF" fieldtype="string" WIDTH="2" />

<FIELD attrname="CEP" fieldtype="string" WIDTH="10" />

<FIELD attrname="TELRES" fieldtype="string" WIDTH="20" />

<FIELD attrname="TELCOM" fieldtype="string" WIDTH="20" />

<FIELD attrname="CPF" fieldtype="string" WIDTH="20" />

<FIELD attrname="RG" fieldtype="string" WIDTH="15" />

<FIELD attrname="CONTATO" fieldtype="string" WIDTH="40" />

<FIELD attrname="EMAIL" fieldtype="string" WIDTH="40" />

</FIELDS>

<PARAMS DATASET_DELTA="1" LCID="2057" />

</METADATA>

- <ROWDATA>

<ROW RowState="1" COD="4" PESSOA="Juridica" DATA="20001030" NOME="CIA. BRASILEIRA DE PETROLEO IPIRANGA" RUA="AV. ESTADO N-2950" CIDADE="S.CAETANO DO SUL" UF="SP" TELCOM="3213977/3213692" />

<ROW RowState="8" NOME="CIA. BRASILEIRA DE PETROLEO IPIRANGAX" />

<ROW RowState="1" COD="5" PESSOA="Juridica" DATA="20001030" NOME="LION" RUA="RUA ARAGUAIA , 130" BAIRRO="V.S.BENTO" CIDADE="S.J.CAMPOS" UF="SP" TELCOM="216800 227386" CONTATO="EDSON" />

<ROW RowState="8" RUA="RUA ARAGUAIA , 1300" />

</ROWDATA>

</DATAPACKET>

Outra maneira seria esta

http://www.informit.com/articles/article.a...94&seqNum=5

http://www.devarticles.com/c/a/Delphi-Kyli...Architecture/3/

Tente esta forma tambem ... veja se funciona

procedure TForm1.Button1Click(Sender: TObject);
begin
   clientdataset2.Data := ClientDataSet1.Delta;
   clientdataset2.SaveToFile('c:\teste.xml');
   clientDataSet2.Close;
   clientdataset2.LoadFromFile('c:\teste.xml');
   clientDataSet2.Open;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, a dica é excelente.

Mas conferi a forma como é gerada meu xml, e vi a incompatibilidade.

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">

<s:Schema id="RowsetSchema">

<s:ElementType name="row" content="eltOnly" rs:updatable="true">

<s:AttributeType name="numero" rs:number="1" rs:nullable="true" rs:writeunknown="true" rs:basecolumn="numero" rs:keycolumn="true" rs:basetable="amtb_dados_site">

<s:datatype dt:type="int" dt:maxLength="4" rs:precision="10"/>

</s:AttributeType>

Este é o formato para importação do Excel. Na verdade o componente cita como sendo " XML format compatible with ADO format ".

Vou ter que refazer aqui, para acessar os dados e jogar isso em um formato compreensível com XML do ClientDataSet.

Uma boa dica é quando salvar:

ClientDataSet.SaveToFile(ExtractFilePath(Application.ExeName) + 'Arquivo.xml', dfXMLUTF8);

Bem, vou tentar fazer a exportação por outro meio. Já dou um retorno... mas se souber de um componente que leia neste formato de xml... de um toque, isso facilitaria até mesmo o uso.

Até... e vamos aos testes...

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...