Datasource (o bebê diabo)

Datasources são esquisitas.

É necessário um datasource tanto no front (/mobile) quanto no back (/backend)

Fiz um script que cria tudo, não há mais sofrimento: download
Só colocar ele na raízzzzzzz (/workfolder)

Datasource do front

De enfeite aparentemente, quando »EU« crio, alguém me falou pra literalmente só colocar chave vazia, e dá certo. O caminho pra criar/achar um é:

erp/modules/nome_do_modulo/mobile/assets/json/datasources/datasource.json

ou

erp/modules/nome_do_modulo/mobile/assets/json/datasources/crud/datasource.json

A diferença? Não sabemos. O arquivo tem o mesmo padrão e se comporta do mesmo jeito dentro ou fora da pasta crud. Obviamente tu tem que mudar o caminho quando tiver referenciando ele em uma tela mas isso é normal.

E.G:

"dataSource": {
                "name": "fis_relatorios#/crud/perfil_cliente",
                "rest": true,
                "lazyLoad": true
            }

Nessa tela como eu DELIBERADAMENTE coloquei o datasource perfil_cliente dentro da pasta crud, o caminho deve conter /crud/

'datasource vazio'

E realmente é necessário que o arquivo exista, senão a tela vai gritar contigo.

Datasource do backend

Esse é o datasource que faz coisas, e aparentemente existem dois tipos.

O primeiro tem uma query e é dinâmico, vejo ele sendo usado em telas, em que você passa dados como filtro e a query te traz o resultado.

Datasource com query

{
    "Meios_de_Pagamento_Eletronico": {
        "columns": [
            "CDEMPRESA",
            "NMEMPRESA",
            "NRINSJUREMPR",
            "CDINSCESTA",
            "IDORIGEM",
            "DTINIAPUR",
            "DTFIMAPUR",
            "NRNOTAFISC",
            "DTEMISSAO",
            "TIPORECE",
            "DTPAGAMENTO",
            "VRNOTAFISC",
            "VRRECEBIMENTO",
            "VRICMS",
            "VRISS",
            "VROUTROS",
            "NRORG"
            
            ],
        "query": "SELECT E.NRORG, E.CDEMPRESA, E.NMEMPRESA, E.NRINSJUREMPR, P.CDINSCESTA, P.IDORIGEM, P.DTINIAPUR, P.DTFIMAPUR, N.NRNOTAFISC, P.DTEMISSAO, P.CDTIPORECE || '-' || T.NMTIPORECE AS TIPORECE, P.DTPAGAMENTO, P.VRNOTAFISC, P.VRRECEBIMENTO, SUM(P.VRICMS) AS VRICMS, SUM(P.VRISS) AS VRISS, SUM(P.VROUTROS) AS VROUTROS FROM PAGELETRONICO P, NOTAFISCAL N, TIPORECE T, EMPRESA E WHERE P.CDEMPRESA = :CDEMPRESA AND P.CDINSCESTA = :CDINSCESTA AND P.DTINIAPUR = :DTINIPERIODO AND P.DTFIMAPUR = :DTFIMPERIODO AND P.CDFILIAL = N.CDFILIAL AND P.NRLANCTONF = N.NRLANCTONF AND P.CDTIPORECE = T.CDTIPORECE AND P.CDTIPORECE = NVL(:CDTIPORECE, P.CDTIPORECE) AND P.CDEMPRESA = E.CDEMPRESA GROUP BY E.NRORG,E.CDEMPRESA, E.NMEMPRESA, E.NRINSJUREMPR, P.CDINSCESTA, P.IDORIGEM, P.DTINIAPUR, P.DTFIMAPUR, N.NRNOTAFISC, P.DTEMISSAO, P.CDTIPORECE, T.NMTIPORECE, P.DTPAGAMENTO, P.VRNOTAFISC, P.VRRECEBIMENTO ORDER BY P.IDORIGEM, N.NRNOTAFISC, P.DTEMISSAO, P.CDTIPORECE"        
        
    }
}

A sintaxe é bem boba, talvez eu até faça um gerador baseado em uma query depois (não vou).

é um json simples, que tem como unico objeto: o nome do datasource.

{
    "nome_do_datasource": {
          
    }
}

dentro desse objeto temos dois atributos: columns (array) e query (string).

{
    "nome_do_datasource": {
        "columns": [],
        "query": ""
    }
}

Dentro de columns, você tem que colocar todas as colunas que o SELECT da query vai te retornar.

Então por exemplo, em:

  "columns": [
            "CDEMPRESA",
            "NMEMPRESA",
            "NRINSJUREMPR",
            "CDINSCESTA",
            "NRORG"
            ]

Todos esses campos são as colunas que a query vai retornar quando rodar e etc;

A query vai trazer CDEMPRESA, NMEMPRESA, NRINSJUREMPR e CDINSCESTA, e como elas estão explicitamente definidas aqui, a tela vai saber o que fazer.

Porém dá pra fazer umas coisas a mais pra convêniencia, por exemplo:

  • Definir relação chave-valor e decidir o nome dos campos que o front end vai receber.

e.g:

  "columns": [
    { 
        "CODIGO": "CDEMPRESA",
        "NOME": "NMEMPRESA"
    }
]

O resultado da query vai trazer os valores de CDEMPRESA e NMEMPRESA, porém os campos vão chegar na tela com os nomes CODIGO e NOME.

E outra coisa que me ensinaram:

Usar sintaxe SQL FIELD AS NAME pra definir os nomes dos campos. (wtffffff)

e.g:

"columns": [
    "CDEMPRESA AS CODIGO",
    "NMEMPRESA AS NOME"
]

É também um datasource válido e vai trazer os valores com os nomes CODIGO e NOME.


Dentro de query, você coloca… a… query.

  "query": "SELECT CDEMPRESA, NMEMPRESA, NRINSJUREMPR, CDINSCESTA FROM TABLE WHERE FIELD == :COLUNA FETCH FIRST 10 ROWS ONLY"

Qualquer variável vai ser preenchida com o valor vindo da tela. :COLUNA por exemplo, vai ser um valor enviado pelo teu front end. O resto o framework faz sozinho e etc etc.

Datasource sem query (mas com colunas)