Ir para conteúdo


Foto

Ext JS 4: Salvar Model/Store que tenha Associations (HasMany e HasOne)


  • Por favor, faça o login para responder
8 respostas neste tópico

#1 Loiane

Loiane

    Member Avançado

  • Expert User
  • 1013 posts
  • LocationSão Paulo - SP

Postado 22 November 2013 - 13:28

Segue exemplo: http://www.loiane.co...smany-e-hasone/

Autora dos livros:

Mastering Ext JS 5 http://bit.ly/1HWeHXh
Mastering Ext JS 4 http://bit.ly/14NZkxg

Ext JS 4: First Look http://bit.ly/o1IP1w
Sencha Architect http://bit.ly/19FVBGs
Curso ExtJS 4 Gratuito http://bit.ly/s5S0Oj (conceitos valem pro Ext 5 e 6 tb)


#2 Tiago Cardoso

Tiago Cardoso

    Iniciante

  • Membros
  • Pip
  • 5 posts

Postado 26 January 2014 - 15:45

Prezados,

Como ficariam essas Associations?

ContaReceber
Cliente
Pessoa
PessoaFisica

Meu retorno json:

{
  "data": [
    {
      "id": "15",
      "forma_pagamento_id": null,
      "centro_custo_id": "1",
      "cliente_id": "2",
      "plano_conta_id": "2",
      "portador_id": null,
      "conta_receber_id": null,
      "nr_documento": "",
      "ds_conta": "xxx",
      "dt_cadastro": "2014-01-22 22:47:53",
      "dt_emissao": "2014-01-22 00:00:00",
      "dt_vencimento": "2014-02-12 00:00:00",
      "dt_recebimento": null,
      "tp_periodicidade": "U",
      "nr_periodicidade": "1",
      "nr_dia_vencimento": "0",
      "vl_conta": "123.00",
      "vl_recebido": null,
      "vl_desconto": null,
      "st_desc_percentual": "0",
      "ds_observacao": "",
      "cs_conta": "",
      "st_baixa": "0",
      "st_cancelado": "0",
      "CentroCusto": {
        "id": "1",
        "tipo_operacao_id": "1",
        "cd_centro_custo": "01",
        "ds_centro_custo": "Contas Internas",
        "st_ativo": "1"
      },
      "Cliente": {
        "id": "2",
        "pessoa_id": "2",
        "Pessoa": {
          "id": "2",
          "cd_tipo_pessoa": "F",
          "Fisica": [
            {
              "id": "2",
              "pessoa_id": "2",
              "profissao_id": null,
              "estado_civil_id": null,
              "nm_pessoa": "Tiago Cardoso",
              "dt_nascimento": null,
              "nm_genitor": null,
              "nm_genitora": null,
              "dt_obito": null,
              "cs_sexo": null
            }
          ]
        }
      },
      "PlanoConta": {
        "id": "2",
        "tipo_operacao_id": "2",
        "plano_conta_id": null,
        "cd_plano_conta": "2",
        "ds_plano_conta": "Receber",
        "st_ativo": "1"
      }
    }
  ],
  "success": true,
  "total": "1"
}


#3 Loiane

Loiane

    Member Avançado

  • Expert User
  • 1013 posts
  • LocationSão Paulo - SP

Postado 27 January 2014 - 13:55

No seu caso você precisa declarar primeiro todos os models de maneira independente.

ContaReceber tem um HasOne Cliente, um HasOne CentroCusto, e um HasOne PlanoConta.
O model Cliente tem um HasOne Pessoa que tem um HasOne PessoaFisica.

Pelo menos foi isso que deu a entender pelo seu json.
E cuidado ao usar Associations, nem sempre é aconselhável. às vezes compensa carregar sob demanda.  :)

Autora dos livros:

Mastering Ext JS 5 http://bit.ly/1HWeHXh
Mastering Ext JS 4 http://bit.ly/14NZkxg

Ext JS 4: First Look http://bit.ly/o1IP1w
Sencha Architect http://bit.ly/19FVBGs
Curso ExtJS 4 Gratuito http://bit.ly/s5S0Oj (conceitos valem pro Ext 5 e 6 tb)


#4 Tiago Cardoso

Tiago Cardoso

    Iniciante

  • Membros
  • Pip
  • 5 posts

Postado 27 January 2014 - 22:55

Loiane,

Obrigado pela reposta! Mas, infelizmente ainda não consegui. :(

Tentei fazer seguindo um exemplo do seu livro:

Livro:
renderer: function(value, metaData, record ){ // #2
                   var groupsStore = Ext.getStore('groups');
                   var group = groupsStore.findRecord('id', value);
                   return group != null ? group.get('name') : value;
}

Meu código:
renderer: function(value, metadata, record){
    var store = Ext.getStore('corporativo.Fisicas');
    var record = store.findRecord('id', value);
    console.log(record);
}

O meu retorno sempre é null. Você tem uma ideia do que pode ser?

Novamente obrigado!


#5 Legolas

Legolas

    Ext JS - Admin

  • Administrators
  • 3497 posts
  • LocationBelo Horizonte

Postado 28 January 2014 - 07:46

Tentei fazer seguindo um exemplo do seu livro:

Livro:

renderer: function(value, metaData, record ){ // #2
                   var groupsStore = Ext.getStore('groups');
                   var group = groupsStore.findRecord('id', value);
                   return group != null ? group.get('name') : value;
}

Meu código:
renderer: function(value, metadata, record){
    var store = Ext.getStore('corporativo.Fisicas');
    var record = store.findRecord('id', value);
    console.log(record);
}

O meu retorno sempre é null. Você tem uma ideia do que pode ser?

Só um pitaco, se vc olhar na API DOC o método Ext.getStore pode receber alguns tipos de parâmetros que no caso do exemplo da @Loiane seria o "storeId" do Store "Packt.store.security.Groups", assim no seu caso o seu Store não deve ter sido definido o storeId com o valor informado por isso retornando null.

"A verdadeira vitória não é derrotar alguém forte... É ser capaz de proteger alguém que você ama de verdade!" (Maito Dai)


#6 Tiago Cardoso

Tiago Cardoso

    Iniciante

  • Membros
  • Pip
  • 5 posts

Postado 28 January 2014 - 09:41

Legolas,

Na verdade já estava definido. Mas, verificando o o proxy, encontrei uma diferença.

O parâmetro  (autoLoad: true) estava definido false.

Isso me gerou dúvidas.

Eu não posso efetuar o load manualmente? Se o autoload estiver como true, não poderia causar problemas de performance?

Já que estou na chuva, essa solução poderia ser aplicada ao combo do formulário?

Novamente obrigado!

#7 Loiane

Loiane

    Member Avançado

  • Expert User
  • 1013 posts
  • LocationSão Paulo - SP

Postado 28 January 2014 - 10:51

Depende Tiago.
No caso do exemplo do livro, eu queria que todas as infos fossem carregadas quando a aplicação iniciasse. Mas cada caso é um caso.
Sim, vc pode fazer o load manualmente, não tem problemas.
Ter autoload como true não tem relação com performance, isso é apenas buscar info no servidor e os requests são assincronos. O que pode atrapalhar é ter vários requests ao mesmo tempo e a info demorar um pouco pra ser carregada, mas como disse, cada caso é um caso. No caso do livro a base tinha pouca info, então isso não atrapalha.
No seu caso, caso deseje ter todo o conteúdo de combobox carregado no momento que a app iniciar, aí o autload pode ser true. Caso deseje carregar por demanda, aí faz o carregamento manualmente.

Quando vc faz:
var groupsStore = Ext.getStore('groups');
var group = groupsStore.findRecord('id', value);
return group != null ? group.get('name') : value;

Espera-se que o conteúdo dessa store já esteja carregado. Caso contrário, vc precisa ter outro approach para mostrar os dados.

Por exemplo, no seu caso, como são informações específicas de uma entidade que se relaciona com outra, não usaria esse approach que usei no livro. Ou faria association (dependendo da quantidade de informação e quantos registros serão carregados de uma vez na grid), ou já pegaria as infos do servidor como a grid precisa (dependendo das opções de editar, caso seja necessário).
No livro fiz assim pois tinha muita info repetida, como cidade -> país que iria ficar pesado ao usar association, já que país se repetia muito na lista.

Autora dos livros:

Mastering Ext JS 5 http://bit.ly/1HWeHXh
Mastering Ext JS 4 http://bit.ly/14NZkxg

Ext JS 4: First Look http://bit.ly/o1IP1w
Sencha Architect http://bit.ly/19FVBGs
Curso ExtJS 4 Gratuito http://bit.ly/s5S0Oj (conceitos valem pro Ext 5 e 6 tb)


#8 Tiago Cardoso

Tiago Cardoso

    Iniciante

  • Membros
  • Pip
  • 5 posts

Postado 28 January 2014 - 16:31

Obrigado pela força! Acho que resolvi a questão do grid.

Mas, quando chamo o meu form também tenho a lista de clientes.

Pessoa
Pessoa -> Cliente
Pessoa -> PessoaFisica
Pessoa -> PessoaJuridica


O problema é que não consigo carregar o nome da pessoa que está na tabela de PessoaFisica/PessoaJuridica.

Vocês tem um exemplo de como carregar os valores de PessoaFisica/PessoaJuridica dentro do combo?

A minha tabela Cliente é apenas uma especialização de Pessoa.

Ext.define('TUPLA.view.corporativo.cliente.ComboRenderer', {
	extend: 'Ext.form.field.ComboBox',
	fieldLabel: 'Cliente',
    store: 'corporativo.Pessoas',
    queryMode: 'local',
    displayField: 'nm_fisica',
    valueField: 'id',
    typeAhead: true,
    forceSelection: true,
    xtype: 'clientecombo',
    listeners:{
    },
    initComponent: function() {
//        var storeCliente = Ext.getStore('Fisicas');
//        var registro = storeCliente.findRecord('id', 2);
//        return registro.get('nm_pessoa');

        this.callParent(arguments);

        this.store.load();

    }
});

Obs. Meu Deus nunca apanhei tanto para fazer um combo.... :)




#9 Loiane

Loiane

    Member Avançado

  • Expert User
  • 1013 posts
  • LocationSão Paulo - SP

Postado 28 January 2014 - 16:54

Qual é a estimativa da quantidade de clientes na base de dados?

Nesse seu combo você quer listar toda a sua base de clientes?

Maneira mais fácil: já monta no servidor o model de acordo que o combo precisa.

Dica: os seus models não precisam ser exatamente a mesma coisa que sua modelagem de dados. Trabalhe no extjs com entidades para facilitar. Lembre-se que o extjs é pra ser a view do seu projeto apenas, o mínimo possível de lógica de negócio. Qualquer complexidade vc pode deixar no codigo server, senão o seu projeto acaba virando um monstro, e não é esse o intuito do framework. Isso vale até mesmo para proteger o seu código.

---
Voltando pro caso do seu combo. Se tiver muitos dados - o que não é recomendado, carregue somente o id e o nome da pessoa por exemplo. Quando o usuário fizer a seleção, carregue as outras infos caso precisa mostrar na tela.
Quando é combo, raramente o usuário vai ficar selecionando várias opções ao mesmo tempo, e se vc trouxer do server todos os dados de todas as pessoas, e esses dados terem pouca probabilidade de uso, aí sim vc pode ter problema de performance em relação a dados.
Volta naquele mesmo cenário: estados por exemplo, não faz mal trazer tudo de vez, pois a probabilidade de uso é alta. Mas informações específicas já faz diferença pois aí a probabilidade de uso é muito pequena.

Autora dos livros:

Mastering Ext JS 5 http://bit.ly/1HWeHXh
Mastering Ext JS 4 http://bit.ly/14NZkxg

Ext JS 4: First Look http://bit.ly/o1IP1w
Sencha Architect http://bit.ly/19FVBGs
Curso ExtJS 4 Gratuito http://bit.ly/s5S0Oj (conceitos valem pro Ext 5 e 6 tb)





0 usuário(s) está(ão) lendo este tópico

0 membros, 0 visitantes, 0 membros anônimos