4D v16

Chamar Tabelas e Métodos 4D

Página Inicial

 
4D v16
Chamar Tabelas e Métodos 4D

Chamar Tabelas e Métodos 4D    


 

O modo de acesso as tabelas 4D as que são feitas referência em Wakanda depende de como está integrado o catálogo externo, o qual se definiu em Wakanda durante sua conexão a aplicação remota (ver Integrar ao modelo ativo ou utilizar um modelo dedicado):

  • fusionado com o modelo ativo (opção pré determinada): neste caso, as tabelas remotas se usam exatamente igual as classes locais através do objeto ds.
  • utilizando um modelo específico: neste caso, as tabelas remotas são propriedades do objeto de modelo exclusivo.

Quando se fusiona ao modelo ativo, as tabelas 4D referenciadas na aplicação Wakanda podem ser utilizadas diretamente no código JavaScript do lado do servidor (SSJS) como propriedades do objeto ds, ao igual que os datastore classes locais.

Nota: o objeto ds contém o armazém (datastore) atual da aplicação Wakanda.

Por exemplo, para realizar uma consulta nos registros da tabela [Empregados], pode escrever:

var emp = ds.Empregados.query("idade> :1",30);
        // recupera uma coleção de registros da tabela Employees
        // sua idade é maior que 30 na variável emp


Do lado do cliente também pode aproveitar os mecanismos automáticos das fontes de dados (datasources) baseadas nas classes de dados e associadas aos widgets. Por exemplo, se associar a fonte de dados "employees" a um widget de tipo 'Grid', pode mostrar a lista de empregados automaticamente:




Quando a tabela está associada a uma fonte de dados, também pode ser acessado a seus dados utilizando esta fonte de dados. Por exemplo, para ordenar a coleção de registros da fonte de dados dos "employees", pode escrever:

sources.employees.orderBy("idade");
        //ordena a coleção dos empregados por sua idade


Para obter mais informação sobre como trabalhar com as classes de dados, consulte a documentação de Wakanda.

As tabelas 4D referenciadas se utilizam no código JavaScript do lado do servidor como propriedades do catálogo onde se localizaram quando foi criado o link. O nome deste catálogo é o que passou no parâmetros de conexão Remote datastore name (diálogo de conexão de Wakanda Studio) ou em nomeLocal (métodos JavaScript).

Por exemplo, foi criado um link chamado "my4Dstore" e deseja realizar uma consulta entre os registros da tabela [Employees], pode escrever:

var emp2 = my4Dstore.Employees.query("age > :1", 30);
     // Procurar nos registros da tabela Employees 
     // No link "my4Dstore" 

Nota de implementação: do lado do cliente, utilizando um modelo dedicado na versão atual de 4D Mobile não permite o acesso as classes remotas no momento.

Os métodos 4D referenciados na aplicação Wakanda podem ser utilizados diretamente no código JavaScript como propriedades dos objetos classe de dados, coleção de entidades ou entidade em função de seu alcance definido do lado 4D (ver o parágrafo Tabela pais e alcance dos métodos projeto). Aqui está a correspondência entre os objetos Wakanda e o alcance dos métodos projeto:

Alcance 4DObjeto Wakanda
tabelaclasse de dados
seleção atualcoleção de entidades
registro atualentidade

Nota: os métodos 4D também podem ser chamados do lado do cliente pelas fontes de dados (ver mais à frente), neste caso todos os métodos estão disponíveis, e a fonte de dados aplica automaticamente a coleção atual ou a entidade atual dependendo do contexto.

Por exemplo, se realizar uma pesquisa com o método query (ver seção anterior), Wakanda devolve uma coleção de entidades. Pode executar qualquer método de projeto 4D cujo alcance declarado seja "seleção atual".

Os métodos 4D podem ser chamados por código JavaScript de três formas:

  • No código JavaScript executado no servidor (SSJS), utilizando o SSJS Datastore API. Neste caso, os métodos de 4D são chamados como as propriedades dos objetos classe de dados, coleção de entidades ou entidade, tal como se descreveu anteriormente.
    Exemplo:

    var vTot = ds.Emp.raiseSalary(param))
        //raiseSalary é uma propriedade de datastore class
        //o catálogo está fusionado ao modelo ativo
    var vTot2 = my4DStore.Company.first().capital(param))
        //capital é uma propriedade de entidade já que first() devolve uma entidade
        //utilização do modelo dedicado my4DStore

  • Desde o código JavaScript executado no cliente (ou seja, o navegador) utilizando o Wakanda Ajax Framework (WAF). Há duas possibilidades:
    • utilizar o WAF Datasource API: este API de alto nível oferece muitas funções automáticas para a gestão de dados. Com esta API, os métodos 4D são chamados como as propriedades das fontes de dados associadas a classe de dados, a entidade coleção atual, ou a entidade atual em função do contexto. Pode manipular valores de retorno dos métodos ou os possíveis erros utilizando a sintaxe assíncrona (requerido para o código executado no cliente). Exemplo:
      sources.employee.raiseSalary(param,
          {onSuccess: function(event)
          { ... //código a executar quando o método terminou}
      }))

      Não é obrigatório utilizar uma função de retro chamada (callback) porque os objetos tipo datasource tem funções automáticas que admitem, por exemplo, a atualização dos dados que aparecem na coleção atual depois de uma pesquisa
    • utilizar o WAF Dataprovider API: este API cliente de baixo nível lhe permite manipular diretamente os objetos. Igual que com o API SSJS Datastore, os métodos 4D são chamados como propriedades de classe de dados, coleção de entidades ou entidade. No entanto, deve gerenciar os valores de retorno dos métodos ou qualquer erro utilizando a sintaxe assíncrona (necessária para código executado no cliente). Exemplo:
      ds.Employee.raiseSalary(param, // a sintaxe se parece a uma chamada SSJS
          {onSuccess: function(event)    // mas é o código do lado do cliente pelo que deve gerenciar o método de retro chamada da chamada assíncrona
          { ... //código a executar quando o método 4D termina}
      }))

    A escolha do lugar (servidor ou cliente) e do API depende das necessidades da aplicação e se descreve na documentação de Wakanda.

Da mesma forma que com os métodos estandarte, você pode passar parâmetros durante a chamada, que se recebem na ordem nos parâmetros $1,$2, etc. Da mesma forma, o método pode devolver um resultado na variável $0.

Exemplo: Você quer lhe dar um aumento de 5% aos empregados cujo salário é menor que 1500.

  • Do lado 4D, o método IncreaseSalary  foi exposto via REST e seu alcance é a "Seleção atual".
    Seu código é o seguinte:
     C_REAL($1)
     READ WRITE([Empregados])
     FIRST RECORD([Empregados])
     While(Not(End selection([Empregados])))
        [Employees]salary:=[Empregados]salary*$1
        SAVE RECORD([Empregados])
        NEXT RECORD([Empregados])
     End while
     UNLOAD RECORD([Empregados])
  • Do lado de Wakanda, execute o seguinte código no servidor:
    var emp = ds.Employees.query("salary < :1",1500); 
            // emp contém a coleção de empregados cujo salário é <1500
        emp.IncreaseSalary(1.05);
            /executa o método IncreaseSalary na coleção
            //Também poderia escrever:
            //"ds.Employees.query("salary < :1",1500).IncreaseSalary(1.05);

Também pode devolver uma seleção 4D diretamente como uma coleção Wakanda utilizando o comando MOBILE Return selection. Por exemplo:

  //método projeto FindCountries
  //FindCountries( string ) -> object
 
 C_TEXT($1)
 C_OBJECT($0)
 QUERY([Countries];[Countries]ShortName=$1+"@")
 $0:=MOBILE Return selection([Countries])

Ao chamar a um método 4D por meio do link de Wakanda:

  • Se o método se aplica a uma seleção (coleção de entidades), esta se converte na seleção atual e 4D se localiza no primeiro registro desta seleção sem carregar ou ativar as relações. Se a seleção está vazia, o comando Selected record number devolve 0 no lugar de 1.
  • Se o método se aplica a um registro (entidade), este se converte no registro atual e se carrega em estado de leitura e escritura. A seleção atual se reduz só a este registro e o comando Selected record number devolve 1.      
  • Nota: por razões de otimização e para evitar bloqueios desnecessários, o registro é carregado em modo de apenas leitura. Entretanto, a tabela está em modo leitura-escritura, por isso simplesmente pode chamar ao comando LOAD RECORD para forçar que o registro seja carregado em modo leitura - escritura sempre que seja necessário.   
Se o método for aplicado a uma tabela (classe de dados) nem a seleção atual nem o registro atual serão afetados.

Tenha em conta que depois de executar um método via 4D Mobile, o contexto 4D se restabelece:

  • as seleções se reduzem a 0,
  • os registros se descarregam,
  • as seleções locais e os conjuntos para o processo se destroem,
  • as transações abertas durante a execução do método se cancelam,
  • a configuração das relações automáticas por campos, os destinos de pesquisa ou consultas no servidor se restabelecem,
  • se cancelam os trabalhos de impressão,
  • as vantagens são fechadas,
  • toda conexão SQL, PHP ou HTTP se fecha.

Deve ter a certeza de que o alcance do método 4D corresponde ao tipo de objeto Wakanda que está chamando, caso contrário o erro "TypeError: 'undefined' is not a function" é devolvido por Wakanda.

Por exemplo, dado o método 4D "getcursel" que contém o seguinte código:

 $0:=Records in selection([Table_1])

Dado o método run do lado Wakanda

var tt = ds.Table_1.query("Field_2 = 'a*'").getcursel();

O método query() devolve uma coleção. Se o alcance do método getcursel foi definido como "Registro atual", Wakanda devolve o seguinte erro:
TypeError: 'undefined' is not a function (evaluating 'ds.Table_1.query("Field_2 = 'a*'").getcursel()')".

 
 

 
PROPRIEDADES 

Produto: 4D
Tema: Chamar Tabelas e Métodos 4D

 
HISTÓRIA 

 
ARTICLE USAGE

4D Mobile ( 4D v16)