O documento descreve como a empresa Esys Colibri integrou Python em seu software de ponto de venda Delphi para facilitar a manutenção e customização de relatórios. Python permitiu que a empresa atendesse às necessidades de relatórios de forma rápida e flexível em apenas 2 dias, ao contrário de meses como antes. A integração entre Python e Delphi também permitiu novas possibilidades de extensão e customização do software para os clientes.
Python + Delphi: Um relacionamento que está dando certo
1. Python + Delphi Um relacionamento que está dando certo (Python Cases) 1 Fernando Macedo
2. Quem? Fernando Macedo Desenvolvedor Delphi/Python Bacharel em Sistemas de Informação (Faculdade Impacta de Tecnologia) Mestrando em Gestão do Conhecimento e Sistemas Inteligentes (IPEN-USP) Membro da APyB 2
3. Onde? Esys Colibri 23 anos de experiência 15.000 clientes 35.000 PDVs instalados 100 revendedores em todo o País Suporte 24/7 em todo o Brasil Atualização constante às novas leis 3
4. O que? Caso da Esys na utilização de Python no Colibri 8 Integração entre Python e Delphi 4
5. Cenário Software PDV Mesa Balcão Ficha Entrega Contexto Empresa tradicional - 23 anos Aplicação comercial Ambiente Windows (MS, C# e Delphi) Nova versão 5
6. Os problemas Módulo de relatórios Formatação embutida no aplicativo Manutenção difícil Integração com terceiros Implementações específicas 6
7. 7 Relatórios texto: Antes { Layout da linha levando em conta qtd fracionada } TmpStr := '%s%-2.0f ' + Trim(strFormatDesc); if QtdeFracionada then TmpStr := '%s%3.3f ' + Trim(strFormatDesc); TmpStr := Format(TmpStr, [strTagIni, fQuantidade, strDescr]); lstMarchador.Add(TrimAcentos(Tmpstr) + strTagFim); sLineMarchadorAgrup:= sLineMarchadorAgrup+';'+TrimAcentos(Tmpstr) + strTagFim; if dmVenda.qryColibriBN_LUGARMESA.AsBoolean then TmpStr := TmpStr + FormatFloat(' #0', MyMaterial[i].LugarMesa); TmpStr := TmpStr + strTagFim; lstRemota.Add(TrimAcentos(TmpStr));
8. O desafio dos relatórios Premissas Gerar a mesma configuração de arquivos; Simples; Suportar troca em run-time; Suportar loops aninhados, do tipo mestre-detalhe; Mesma origem dos dados para os relatórios visuais; Ter toda a infra construída em dias, e não em meses. 8
9. Por que Python? Expressividade Legibilidade de código Codificação rápida Vasta coleção de bibliotecas Recurso X, Y, Z 9
10. A linguagem certa E não sabendo que era impossível, Python foi lá e fez! Solução da infra em 2 dias! Ganhou moral. 10
15. Uso do P4D 15 type EngineDoPython = class private class var _Eng: TPythonEngine; _IO: TPythonInputOutput; _Dir: string; private const NOME_DLL = 'python27.dll'; NOME_BIBLIOTECA = 'python27.zip'; public [...] class procedure AdicionarDiretorioAoPath(umDiretorio: string); class property Engine: TPythonEngine read ObterEngine; class property DirDoPython: string read _DirDoPython write _DirDoPython; class property Iniciado: Boolean read ObterIniciado; class property IO: TPythonInputOutput read _IO; end;
16. Uso do P4D 16 class constructor EngineDoPython.Create; begin _Eng := TPythonEngine.Create(nil); _IO := TPythonInputOutput.Create(nil); _Eng.DllName := NOME_DLL; _Eng.PyFlags := _Eng.PyFlags + [pfIgnoreEnvironmentFlag]; _Eng.IO := _IO; end; class procedure EngineDoPython.Iniciar; begin _Eng.DllPath := arquivos.NormalizarPasta(DiretorioDoPython); arquivos.ExecutarNaPasta(DiretorioDoPython, procedure begin _Eng.LoadDll(); SysModule.path.append(_Eng.DllPath); SysModule.path.append(_Eng.DllPath + NOME_BIBLIOTECA); end); end;
17. O que pode ser feito? Módulos *.pyd Executar códigos Python; Expor classes Delphi ao Python; 17
18. Problemas e riscos CTypes Manifesto Pessoal Disseminar conhecimento à equipe Continuidade do projeto Python4Delphi Suporte a futuras versões 18
19. Minhas impressões A ilusão de que verificação de tipos em tempo de compilação resolve todos os problemas Python Oferece alto nível de abstração Escreve-se menos código Maior produtividade Python não se põe entre o desenvolvedor e o problema 19