Página 1 de 2

Duvida com HASH

Enviado: 09 Jan 2017 14:41
por frazato
Boa tarde! estou tendo que fazer a integração com o sistema "meus pedidos" que faz a parte de venda externa via tablet e trata arquivos em formato JSON, até gera os arquivos ok, o problema e o retorno do pedido que também retorna um arquivo JSON, vi uma função o harbour que faz a conversão para arquivo HASH até ai blz , problema é que não estou conseguindo fazer o mesmo troca de "elemento" tipo "items" e codigo de itens para adicionar em meu dbf.

Código: Selecionar todos

//---------------------------------------------------------
Function Main()
Local cLinha := ''
cLinha := ;
''+;
   [ {]+;
    ["id": 1,]+;
     ["cliente_id": 123,]+;
     ["observacoes": "Favor faturar urgente.",]+;
      '"items": {'+;
        ["id": 5000,]+;
         ["produto_id": 1001]+;
           '},'+;
			  [{"id": 8000,"produto_id": 1002}]+;
			  ' }'
           
Alert( cLinha)

cJSON := cLinha
hJSON := {}//hb_hash()
hb_JSONDecode( cJSON, @hJSON )

//hb_HKeepOrder( hJSON, .T. )

? Len(hJSON)
? hJSON['cliente_id']	 
? hJSON['observacoes']	 
? hJSON['items']	 

If !hb_HHasKey( hJSON, 'items','produto_id')
    Alert('Nao tem a chave items')
Else
 *?  hJSON['items','produto_id']
 *?  Len(hJSON['items'])//,'produto_id'])
 *For i:= 1 to Len(hJSON['items'])
 *   ? hJSON['items','produto_id']
 *   *? Hb_hpos(hJSON,'produto_id')
 *Next
Endif
element := 0
hTeste  := hJSON

FOR EACH element IN hTeste['items']
	      *? element['items','produto_id']                          // valor do componente, neste caso 1 e 2
	      *? element:__enumKey()     //neste caso é apresentado a chave da hash, neste caso "a" e "b"
	      ? hTeste['items','produto_id']
	      *? hb_hPos(hTeste['items','produto_id'])
	      *? hb_OsNewLine()
	      ? hb_HDEL( hTeste,'produto_id')
	      ? HB_HPOS( hTeste,'items' ) 
	      ? Len(hTeste['items'])
    
NEXT

Return nil
Preciso fazer ele pular como se fosse um arrays.

Frazato

Duvida com HASH

Enviado: 09 Jan 2017 15:27
por janio
Frazato,

O sistema é "meus pedidos" ou "suas vendas" (https://www.suasvendas.com/) ?

Semana passada peguei um cliente que irá fazer a parte de vendas por tablet através do "suas vendas" e o sistema de gestão será o nosso. Mas ainda não deu nem tempo de ver a parte de integração...

Acompanhando esse tópico...

Janio

Duvida com HASH

Enviado: 09 Jan 2017 15:36
por frazato
é meus pedidos.com.br

https://meuspedidos.com.br/153989/integ ... parceiros/

o meu cliente gostou do sistema, também achei legal.

Frazato

Duvida com HASH

Enviado: 09 Jan 2017 16:25
por wmanesco
Frazato, não entendi direito o problema..


É quando você tem que mandar um json, ou o problema é em ler o retorno do app?

Se for para enviar, o hb também a função hb_JSONEncode(hJSON), ou seja, poderia ser assim:

Código: Selecionar todos

hJSON := hb_Hash()
hItems := hb_Hash()

hItems["..."] //aqui coloca o json de itens


hJSON["id"] := 1
hJSON["items"] := hItems
//se items for array, também da para fazer tipo

hJSON["items"] := { hItems, hItems2 }

cJSON := hb_JSONEncode(hJSON)

Como disse não sei se o problema é esse..

Duvida com HASH

Enviado: 09 Jan 2017 16:29
por frazato
Meu problema é para importar o pedido gerado ( JSON) para meu sistema, imagina que num pedido veem varios itens no mesmo JSON e preciso tratar cada elemento como se fosse um item, tipo assim!

For i:= 1 to Len(Itens)
? "itens"+Str(i,2) +' Produto '+Itens[i,2] // 'Codigo'
Next

Frazato

Duvida com HASH

Enviado: 09 Jan 2017 16:41
por wmanesco
Me parece que este json está incorreto, olha ele corrigido (no meu ponto de vista), parece que deu certo..

Código: Selecionar todos

//---------------------------------------------------------
Function Main()
Local cLinha := ''
cLinha := ;
''+;
   [ {]+;
    ["id": 1,]+;
     ["cliente_id": 123,]+;
     ["observacoes": "Favor faturar urgente.",]+;
      '"items": [ {'+;
            ["id": 5000,]+;
            ["produto_id": 1001]+;
          '},'+;
          '{"id": 8000,"produto_id": 1002}'+;
           ']}'
           
hb_memoWrit("teste.json", cLinha)		   //apenas para visualização
Alert( cLinha)

cJSON := cLinha
hJSON := {}//hb_hash()
hb_JSONDecode( cJSON, @hJSON )

element := 0
hTeste  := hJSON

FOR EACH element IN hTeste['items']

	? element

	? element["id"]
	? element["produto_id"]
    
NEXT

Return nil

Duvida com HASH

Enviado: 09 Jan 2017 16:54
por frazato
:{ :{ :{ :{ :{
ShoW!

deu certo, acho que eu mexi no JSON, agora tá certinho, muito obrigado!

Frazato

Duvida com HASH

Enviado: 09 Jan 2017 18:59
por wmanesco
:D

Duvida com HASH

Enviado: 09 Jan 2017 20:55
por fladimir
Não precisaria meu comentário mas faço questão...

Entrei pra ver do q se tratava e vi q era um assunto q não entendia mas vou acompanhando para aprender e essa interação q vemos e auxilio dos colegas e quando conseguimos ver a questão resolvida nos motiva.

Parabéns colegas.

:-Y :-Y :-Y

Duvida com HASH

Enviado: 18 Jan 2017 17:45
por frazato
Boa tarde!
Este é um arquivo JSON que tem os dados de pedidos e itens de pedidos, quando tenho apenas um pedido consigo importar através da rotina acima, mais tenho que retirar os "[]" do inicio e final do arquivo, agora não consigo fazer a leitura do arquivo JSON com mais de um pedido, que coisa de doido isso, saudade de usar arquivo txt ou xml esse JSON tá me deixando doido.

Segue arquivo em anexo para quem possa me dar uma ajudinha se possivel.

Frazato

Código: Selecionar todos

    {
        "cliente_id": 2209938,
        "condicao_pagamento": "28dias",
        "forma_pagamento_id": 0,
        "cliente_nome_fantasia": "",
        "cliente_complemento": "",
        "data_emissao": "2017-01-17",
        "total": 224.41,
        "id": 1558742,
        "representada_id": 44406,
        "transportadora_id": 0,
        "representada_razao_social": "JAF DESENVOLVIMENTOS",
        "transportadora_nome": "",
        "cliente_suframa": "",
        "nome_contato": "",
        "cliente_inscricao_estadual": "000000000000000",
        "cliente_bairro": ".",
        "status": "2",
        "condicao_pagamento_id": 0,
        "cliente_estado": "",
        "observacoes": "mensagem adicionais",
        "numero": 1,
        "ultima_alteracao": "2017-01-17 09:15:40",
        "representada_nome_fantasia": "JAF DESENVOLVIMENTOS",
        "criador_id": 36564,
        "cliente_cep": "",
        "cliente_rua": ".",
        "items": [
            {
                "tipo_ipi": "P",
                "quantidade": 4.0,
                "preco_bruto": 3.69,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735289,
                "produto_nome": "ABACAXI PEROLA UN",
                "produto_id": 10966771,
                "quantidade_grades": [
                    {
                        "cor": "Azul",
                        "quantidade": 2.0,
                        "tamanho": null
                    },
                    {
                        "cor": "Verde",
                        "quantidade": 2.0,
                        "tamanho": null
                    }
                ],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 14.76,
                "produto_codigo": "02002",
                "preco_liquido": 3.69,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 35.0,
                "preco_bruto": 5.99,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "teste",
                "id": 10735290,
                "produto_nome": "BANANA MACA KG",
                "produto_id": 10966780,
                "quantidade_grades": [
                    {
                        "cor": "Azul",
                        "quantidade": 12.0,
                        "tamanho": null
                    },
                    {
                        "cor": "Verde",
                        "quantidade": 23.0,
                        "tamanho": null
                    }
                ],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 209.65,
                "produto_codigo": "02010",
                "preco_liquido": 5.99,
                "descontos": []
            }
        ],
        "cliente_cidade": ".",
        "extras": [],
        "contato_nome": "",
        "cliente_cnpj": "",
        "cliente_razao_social": "DORIVAL BATISTA DE LIMA",
        "cliente_numero": null
    },
    {
        "cliente_id": 2213081,
        "condicao_pagamento": "resr",
        "forma_pagamento_id": 0,
        "cliente_nome_fantasia": "supermercado la villa ltda",
        "cliente_complemento": "",
        "data_emissao": "2017-01-18",
        "total": 209.32,
        "id": 1558753,
        "representada_id": 44406,
        "transportadora_id": 42367,
        "representada_razao_social": "JAF DESENVOLVIMENTOS",
        "transportadora_nome": "proprio",
        "cliente_suframa": "",
        "nome_contato": "",
        "cliente_inscricao_estadual": "495097613116",
        "cliente_bairro": "JARDIM MATILDE",
        "status": "2",
        "condicao_pagamento_id": 0,
        "cliente_estado": "",
        "observacoes": "",
        "numero": 2,
        "ultima_alteracao": "2017-01-18 15:39:28",
        "representada_nome_fantasia": "JAF DESENVOLVIMENTOS",
        "criador_id": 36564,
        "cliente_cep": "",
        "cliente_rua": "R DO EXPEDICIONARIO",
        "items": [
            {
                "tipo_ipi": "P",
                "quantidade": 6.0,
                "preco_bruto": 2.22,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735303,
                "produto_nome": "AMENDOIM DESC SALG 150GR YOKI",
                "produto_id": 10968644,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 13.32,
                "produto_codigo": "00803",
                "preco_liquido": 2.22,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 5.0,
                "preco_bruto": 1.0,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735304,
                "produto_nome": "CORANTE EM PO VERMELHO REGINA 5GR",
                "produto_id": 10967931,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 5.0,
                "produto_codigo": "00097",
                "preco_liquido": 1.0,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 1.0,
                "preco_bruto": 1.0,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735305,
                "produto_nome": "CORANTE EM PO VERDE REGINA 5GR",
                "produto_id": 10967930,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 1.0,
                "produto_codigo": "00096",
                "preco_liquido": 1.0,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 2.0,
                "preco_bruto": 1.0,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735306,
                "produto_nome": "CORANTE EM PO AZUL REGINA 5GR",
                "produto_id": 10967928,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 2.0,
                "produto_codigo": "00094",
                "preco_liquido": 1.0,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 3.0,
                "preco_bruto": 1.0,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735307,
                "produto_nome": "CORANTE EM PO AMARELO REGINA 5GR",
                "produto_id": 10967929,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 3.0,
                "produto_codigo": "00095",
                "preco_liquido": 1.0,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 50.0,
                "preco_bruto": 3.7,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735308,
                "produto_nome": "FERMENTO FRESCO BIO LEVAPAN 500 GR",
                "produto_id": 10968200,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 185.0,
                "produto_codigo": "00366",
                "preco_liquido": 3.7,
                "descontos": []
            }
        ],
        "cliente_cidade": "OURINHOS",
        "extras": [],
        "contato_nome": "",
        "cliente_cnpj": "",
        "cliente_razao_social": "SUPERMERCADO LA VILLA LTDA",
        "cliente_numero": null
    },
    {
        "cliente_id": 2212195,
        "condicao_pagamento": "rrss",
        "forma_pagamento_id": 0,
        "cliente_nome_fantasia": "PADARIA PAO DE ACUCAR",
        "cliente_complemento": "",
        "data_emissao": "2017-01-18",
        "total": 22.3,
        "id": 1558755,
        "representada_id": 44406,
        "transportadora_id": 42367,
        "representada_razao_social": "JAF DESENVOLVIMENTOS",
        "transportadora_nome": "proprio",
        "cliente_suframa": "",
        "nome_contato": "",
        "cliente_inscricao_estadual": "209.308.515.118",
        "cliente_bairro": "VILA CARMEM",
        "status": "2",
        "condicao_pagamento_id": 0,
        "cliente_estado": "",
        "observacoes": "",
        "numero": 3,
        "ultima_alteracao": "2017-01-18 17:24:20",
        "representada_nome_fantasia": "JAF DESENVOLVIMENTOS",
        "criador_id": 36564,
        "cliente_cep": "",
        "cliente_rua": "AV CRUZEIRO DO SUL, 14-60",
        "items": [
            {
                "tipo_ipi": "P",
                "quantidade": 2.0,
                "preco_bruto": 1.7,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735311,
                "produto_nome": "BAT OND CEB E SAL 100GR YOKITOS",
                "produto_id": 10968502,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 3.4,
                "produto_codigo": "00662",
                "preco_liquido": 1.7,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 2.0,
                "preco_bruto": 1.45,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735312,
                "produto_nome": "BAT LISA NAT 50GR YOKITOS",
                "produto_id": 10968642,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 2.9,
                "produto_codigo": "00801",
                "preco_liquido": 1.45,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 2.0,
                "preco_bruto": 1.18,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735313,
                "produto_nome": "BAT LISA FRANGO GREL 50GR YOKITOS",
                "produto_id": 10968639,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 2.36,
                "produto_codigo": "00798",
                "preco_liquido": 1.18,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 1.0,
                "preco_bruto": 5.24,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735314,
                "produto_nome": "AMENDOIM 1 KG",
                "produto_id": 10967819,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 5.24,
                "produto_codigo": "00006",
                "preco_liquido": 5.24,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 2.0,
                "preco_bruto": 1.2,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735315,
                "produto_nome": "ALIM SOJA MORANGO 200ML MAIS VIDA",
                "produto_id": 10968693,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 2.4,
                "produto_codigo": "00851",
                "preco_liquido": 1.2,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 3.0,
                "preco_bruto": 1.2,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735316,
                "produto_nome": "ALIM SOJA MARACUJA 200ML MAIS VIDA",
                "produto_id": 10968916,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 3.6,
                "produto_codigo": "01068",
                "preco_liquido": 1.2,
                "descontos": []
            },
            {
                "tipo_ipi": "P",
                "quantidade": 2.0,
                "preco_bruto": 1.2,
                "tabela_preco_id": 0,
                "ipi": 0.0,
                "observacoes": "",
                "id": 10735317,
                "produto_nome": "ALIM SOJA MANGA 200ML MAIS VITA",
                "produto_id": 10968918,
                "quantidade_grades": [],
                "excluido": false,
                "cotacao_moeda": 1.0,
                "st": 0.0,
                "subtotal": 2.4,
                "produto_codigo": "01070",
                "preco_liquido": 1.2,
                "descontos": []
            }
        ],
        "cliente_cidade": "BAURU",
        "extras": [],
        "contato_nome": "",
        "cliente_cnpj": "",
        "cliente_razao_social": "MINAMOTO E MINAMOTO LTDA",
        "cliente_numero": null
    }

Duvida com HASH

Enviado: 19 Jan 2017 09:08
por wmanesco
Acho que é o seguinte:

se o JSON veio assim:

Código: Selecionar todos

[
   ...
]
Quando você usar o hb_jsondecode() ele vai te retornar um array de hash, algo assim:

No caso seus pedidos estariam nesse array...

Código: Selecionar todos

   HB_JSONDecode(cJSON, @aJSON)

   ? hb_isArray(aJSON) //deve ser true

   FOR EACH hPedido IN aJSON
      ? hPedido["client_id"]
   NEXT
Desse jeito você não deve retirar o "[]" pois ele que indica que é um array, e assim permite colocar vários pedidos em um unico JSON

Duvida com HASH

Enviado: 19 Jan 2017 15:32
por frazato
Boa tarde!!
o retorno do json tá igualzinho você falou, mais seu exemplo não funciona da erro, ate consegui ler os numero de pedido mais os itens consegui aparentemente colocar em um array mais não tó dando conta de ler o resultado, de uma olhada fazendo um favor se puder me ajudar agradeço.

Código: Selecionar todos

 hTeste  := hJSON
          aJSON   := {}//hb_hash()
	 
	   HB_JSONDecode(cJSON, @aJSON)
	 
	   ? hb_isArray(aJSON) //deve ser true
	   ? Len(ajSon)
	   i:= 1
	   FOR EACH element IN aJSON
	        ? aJSON[i]["cliente_razao_social"]
	        aItens := aJSON[i]['items']
	        ? hb_isArray(aItens) //deve ser true
	        ? Len(aItens)
	        For r:= 1 to Len(aItens)
	            ? aItens[r]//['items'][1]
	        Next
		     i++
	   NEXT

Duvida com HASH

Enviado: 19 Jan 2017 16:48
por frazato
Resolvido!!! ufa!!! assim funciona!!

Muito obrigado pela ajuda por enquanto.. rs

Frazato

Código: Selecionar todos

FOR EACH element IN aJSON
	        ? aJSON[i]["cliente_razao_social"]
	        ? aJSON[i]['items']
	        aItens := Hb_Hash()
	        aItens = aJSON[i]['items']
	        ? Len(aItens := aJSON[i]['items'])
	        For r:= 1 to Len(aItens)
	          ? 'Quant:'+Str(aItens[r]['quantidade'],8,2)+' Preco unit.:'+Str(aItens[r]['preco_liquido'],9,2)
	          ? aItens[r]['produto_codigo']+' '+aItens[r]['produto_nome']
	        Next
		     i++
	   NEXT

Duvida com HASH

Enviado: 19 Jan 2017 19:03
por wmanesco
Funcionando é o que importa =)

A função de decodificar JSON está bem legal, só prestar atenção no JSON...

Quando há JSON dentro de JSON

Código: Selecionar todos

{
   "item": {"id":1, "desc": "teste"}
}
Será uma Hash assim

Código: Selecionar todos

? hJSON["item"]["id"]
? hJSON["item"]["desc"]
E também pode ser que tenha arrays para agrupar variados itens

Código: Selecionar todos

{
   "itens": [ {"id":1, "desc": "teste"}, {"id":2, "desc": "teste2"}]
}

Código: Selecionar todos

? hJSON["itens"][1]["id"]
? hJSON["itens"][1]["desc"]

? hJSON["itens"][2]["id"]
? hJSON["itens"][2]["desc"]

Duvida com HASH

Enviado: 20 Jan 2017 17:19
por frazato
Blz!!! vou ficar atento mais por hora tá funcionando, ufa, treco enrolado! to ficando velho não aprendo "comandos" novos.

Valeu muito obrigado!

Frazato