GDMenus

Standard
Tive a oportunidade de testar uma excelente ferramenta para geração de menus. Esta ferramenta se chama GDMenus e foi desenvolvida pela Camila Moreira. No sistema existem duas opções de menus: Admin 1, cujo o menu fica na lateral esquerda e pode ser escondido, para ganhar mais espaço na tela e Admin 3 que um menu horizontal. A ferramenta é muito produtiva, possibilitando com poucos passos a geração do menu, porém como não faz parte de ferramenta nativa Scriptcase é necessário um pequeno ajuste que no próprio passo a passo da geração é explicado e faz com que as aplicações se adaptem ao menu escolhido. Sugiro que quem estiver procurando uma ferramenta produtiva para gerar menus para sistemas em Scriptcase faça um teste.
O link do site do sistema segue abaixo, onde é possível fazer um teste por um período limitado, ao acessar o sistema existe um fórum no qual os usuários podem tirar dúvidas e a própria criadora da ferramenta também participa ajudando os usuários.
Além da ferramenta de geração de menus, os usuários que assinam algum dos planos disponíveis tem acesso aplicações desenvolvidas pela Camila, com tutoriais de como podem usar e integrar aos seus sistemas.

Tabelas do scriptcase

Standard

Na versão 8.1 o ScriptCase faz uso de tabelas para armazenar os dados das aplicações desenvolvidas:

sc_tbprj Tabela de Grupos
sc_tbusu Tabela de Usuários
sc_tbati Tabela de Status dos Usuários
sc_tbapl Tabela de Aplicações
sc_tbcmp Tabela de Campos
sc_tblog Tabela de esquemas de log
sc_tblog_apl Tabela de Backup de Aplicações
sc_tblog_cmp Tabela de Backup de Campos
sc_tbrep Tabela de Dicionário de Dados
sc_tbrep_tables Tabela de Dicionário de Dados (Tabelas)
sc_tbrep_fields Tabela de Dicionário de Dados (Campos)
sc_tbconex Tabela de Conexoes
sc_tbsess Tabela de sessão
sc_tbversao Tabela de Versao do Projeto
sc_tbevt Tabela de Eventos
sc_tblog_evt Tabela de Backup de Eventos
sc_tbtrans Tabela de Transacoes
sc_tbtodo Tabela de lista de tarefas
sc_tbmsg Tabela de mensagens entre usuários

Barra de progresso no scriptcase

Standard

Pare este exemplo eu usei a tabela order_details da base de dados do projeto samples(um dos projetos de exemplo disponíveis no próprio scriptcase)

1) Crie a biblioteca pública com o código no link abaixo:


ProgressBar


2) Crie uma aplicação do tipo blank com o código abaixo e marque para usar a biblioteca que você criou no passo 1 para usar nesta aplicação

 

PHP Code:
// Barra de progresso $prb = new ProgressBar(400, 30); // create new ProgressBar (width:300px,height:30px)

$prb->left = 400; // position from left
$prb->top = 120; // position from top
$prb->addLabel('text','txt1');
$prb->setLabelFont('txt1','20');
$prb->setLabelPosition('txt1','405','122','300','20');
$prb->setBarColor('#00FF7F');
$prb->setBarDirection('right');
$prb->show(); // show the ProgressBar
$sql="SELECT * FROM order_details UNION SELECT * FROM order_details UNION SELECT * FROM order_details UNION SELECT * FROM order_details UNION SELECT * FROM order_details"; sc_lookup(dataset,$sql);

$contador= count({dataset});
$prb->max = $contador;
for($b=0;$b<$contador;$b++) {
   
   $nome = {dataset[$b][0]};
   $cpf = {dataset[$b][1]};
   $id = {dataset[$b][2]};
   $prb->moveStep($b);
   $prb->setLabelValue('txt1','Processando: '.$b.'/'.$contador);
   flush();
   ob_flush();}
$prb->setLabelValue('txt1','Concluido!');  

Desativar botão (Para rotinas que demoram a processar)

Standard

Essa dica pode ser utilizada em aplicações que demoram quando estão processando e desta forma você pode evitar que o usuário clique novamente no botão. Basta adicionar o código abaixo na configuração javascript formonload da sua aplicação no scriptcase, onde sub_form_b é o id do botão que você quer esconder, para descobrir o id que o scriptcase gera basta inspecionar o elemento(botão) com o navegador:

$( ‘#sub_form_b’ ).click(function() {
alert(‘Botão Clicado Aguarde Processamento’);
$(this).hide();
});

Javascript Scriptcase

Javascript no Scriptcase

 

 

Dimensão do Modal Com sc_redir

Standard

Esta dica explica como você pode definir a largura e altura do modal de destino usando o macro sc_redir do scriptcase, foi testado tanto na versão 5 como na 6 e funcionou perfeitamente:

// 400 é a altura e 220 é a largura

sc_redir(aplicacao_destino.php, global_msg=[global_msg];tipo_msg=[tipo_msg], “modal”,””,”400″,”220″);161

Mostrar Versão do Sistema no login

Standard

Primeiro coloque o trecho de código abaixo no Evento OnScriptInit da aplicação de login

[versao_sist]=$this->Ini->nm_app_version;

Depois vá em Aplicação > Variáveis Globais e Deixe marcado apenas o escopo de SESSION e no Tipo selecione saída, desta forma esta váriável global pode ser acessada em outras aplicações do sistema caso queira exibir a versão.

Depois vá em Controle > Layout > Cabeçalho & Rodapé e vá em variáveis do cabeçalho ou rodapé, depende de onde você escolher exibir e em uma Linha exemplo LIN1_COL2 selecione no combo Valor e na caixa de texto que aparecerá ao lado digite o nome da variável global [versao_sist]

Como Integrar Relatório Jasper com o Scriptcase

Standard

Segue um passo a passo de como: Integrar os relatórios jasper com Scriptcase:
• Testado com: PHP Version 5.3.5 (Xampp 1.7.4) / Tomcat 6.0 / Mysql, SqlServer
• Instalar pacotes para utilizacao de web-services (atraves do pear)

$pear install SOAP-0.12.0
$pear install Net_DIME-1.0.2
• Como instalar e configurar o Jasper Reports:
1-Instalar Jasper Server
2-Incluir .jar do conector jtds na lib do Tomcat
3-Adicionar novo Datasource:
driver = net.sourceforge.jtds.jdbc.Driver
url/user/pass = banco
4-Inserir novos relatorios apontando para o Datasource criadoAbaixo você segue o código para chamar o relatório (Utilizar este código em uma aplicação do tipo Blank):
<?php
// PHP client for requesting reports from JasperServer via SOAP.
//USAGE:
$jasper_url = "http://localhost:8081/jasperserver/services/repository";
$jasper_username = "jasperadmin";
$jasper_password = 'jasperadmin';
$client = new JasperClient($jasper_url, $jasper_username, $jasper_password);
/* Nome do arquivo do relatório importado para o jasper server */
$report_unit = "/reports/relatorio";
/* Formato de exportaçao do relatório */
$report_format = "PDF";
/* Parâmetos que são passados para o relatório, caso seja mais de um separar por vírgulas */
$report_params = array('id_plano_curso' => 4); 
$result = $client->requestReport($report_unit, $report_format,$report_params); 
header('Content-type: application/pdf');
echo $result;
 
 
/* Essa classe (abaixo) você pode colocar numa biblioteca no Scriptcase e só marcar nas aplicações que você for usar */
class JasperClient {
  private $url;
  private $username;
  private $password;
  
  public function __construct($url, $username, $password) {
    $this->url = $url;
    $this->username = $username;
    $this->password = $password;
  }
  
  public function requestReport($report, $format, $params) {
    $params_xml = "";
    foreach ($params as $name => $value) {
      $params_xml .= "<parameter name=\"$name\"><![CDATA[$value]]></parameter>\n";
    }
    
    $request = "
      <request operationName=\"runReport\" locale=\"pt_BR\">
        <argument name=\"RUN_OUTPUT_FORMAT\">$format</argument>
        <resourceDescriptor name=\"\" wsType=\"\"
        uriString=\"$report\"
        isNew=\"false\">
        <label>null</label>
        $params_xml
        </resourceDescriptor>
      </request>
    ";
    
    $client = new SoapClient(null, array(
        'location'  => $this->url,
        'uri'       => 'urn:',
        'login'     => $this->username,
        'password'  => $this->password,
        'trace'    => 1,
        'exception'=> 1,
        'soap_version'  => SOAP_1_1,
        'style'    => SOAP_RPC,
        'use'      => SOAP_LITERAL
 
      ));
 
    $pdf = null;
    try {
      $result = $client->__soapCall('runReport', array(
        new SoapParam($request,"requestXmlString") 
      ));
      
      $pdf = $this->parseReponseWithReportData(
        $client->__getLastResponseHeaders(),
        $client->__getLastResponse());
    } catch(SoapFault $exception) {
      $responseHeaders = $client->__getLastResponseHeaders();
      if ($exception->faultstring == "looks like we got no XML document" &&
          strpos($responseHeaders, "Content-Type: multipart/related;") !== false) {
        $pdf = $this->parseReponseWithReportData($responseHeaders, $client->__getLastResponse());
      } else {
        throw $exception;
      }
    }
    
    if ($pdf)
      return $pdf;
    else
      throw new Exception("Jasper did not return PDF data. Instead got: \n$pdf");
  }
  
  protected function parseReponseWithReportData($responseHeaders, $responseBody) {
    preg_match('/boundary="(.*?)"/', $responseHeaders, $matches);
    $boundary = $matches[1];
    $parts = explode($boundary, $responseBody);
      
    $pdf = null;
    foreach($parts as $part) {
      if (strpos($part, "Content-Type: application/pdf") !== false) {
        $pdf = substr($part, strpos($part, '%PDF-'));
        break;
      }
    }
    
    return $pdf;
  }
 
}