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/

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.