Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde pessoal, tudo bem com vocês?
Sou consultor ABAP, porém tenho que voltar as minhas raizes e desenvolver um sisteminha em PHP aqui para a consultoria em que trabalho.
O programa é "simples", tenho um programa ABAP e preciso fazer algumas validações em seu código fonte. Então pensei logo no nosso querido amigo preg_split para poder separar o código com "problema".
Por exemplo, tenho uma regra que diz que não é bom fazer "SELECT " então tenho que procurar todos os comandos SQL com SELECT .
Por exemplo, o código abaixo:
REPORT Zbc0046.
TABLES: ztbc045, " Registros de usuários
ztbc045_log. " Log de Registros de usuários
TYPE-POOLS: truxs, slis.
DATA: t_ztbc045 TYPE STANDARD TABLE OF ztbc045, " Tabela principal.
wa_ztbc045 LIKE LINE OF t_ztbc045, " WA da tabela principal.
e_ztbc045 TYPE ztbc045,
" Tabela interna auxiliar de Log de erros.
aux_log_ztbc045 LIKE LINE OF t_ztbc045,
" Tabela interna da tabela de LOG de GRUD de usuários.
t_ztbc045_log LIKE ztbc045_log OCCURS 0,
" WA da tabela de LOG de GRUD de usuários.
wa_ztbc045_log TYPE ztbc045_log.
* Tabela de sistemas para a tela do usuário
data: t_systens type USZBVSYS OCCURS 0.
TYPES: BEGIN OF ty_log_erros,
msg_erro TYPE string,
bname TYPE ztbc045-bname,
acao TYPE ztbc045-acao,
pernr TYPE ztbc045-pernr,
land1 TYPE ztbc045-land1,
ussystem TYPE ztbc045-ussystem,
incidencia TYPE ztbc045-incidencia,
datei TYPE ztbc045-datei,
name1 TYPE ztbc045-name1,
email TYPE ztbc045-email,
link_email TYPE ztbc045-link_email,
observacao TYPE ztbc045-observacao,
uname TYPE ztbc045-uname,
udate TYPE ztbc045-udate,
END OF ty_log_erros.
DATA: wa_log_erros TYPE ty_log_erros.
DATA: t_log_erros TYPE STANDARD TABLE OF ty_log_erros.
* Tabela interna do arquivo excel sem o MANDT.
DATA: BEGIN OF t_excel_ztbc045 OCCURS 0,
bname TYPE ztbc045-bname,
acao TYPE ztbc045-acao,
pernr TYPE ztbc045-pernr,
land1 TYPE ztbc045-land1,
ussystem TYPE ztbc045-ussystem,
incidencia TYPE ztbc045-incidencia,
datei TYPE ztbc045-datei,
name1 TYPE ztbc045-name1,
email TYPE ztbc045-email,
link_email TYPE ztbc045-link_email,
observacao TYPE ztbc045-observacao,
uname TYPE ztbc045-uname,
udate TYPE ztbc045-udate,
tp_atualiza TYPE ztbc045_log-tp_atualiza,
END OF t_excel_ztbc045.
* ALV OOP.
DATA: ctl_alv TYPE REF TO cl_gui_alv_grid,
ctl_cccontainer TYPE REF TO cl_gui_custom_container.
* ALV field catalogs OOP
DATA: it_fieldcatalog TYPE lvc_t_fcat,
wa_fieldcatalog TYPE lvc_s_fcat.
* ActionW - Leonardo Fanhoni - 12.05.2011 - Inicio
DATA: it_fieldcatalog_alv TYPE slis_t_fieldcat_alv,
wa_fieldcatalog_alv TYPE slis_fieldcat_alv.
* ALV layout (basico).
DATA: gs_layout_basic TYPE slis_layout_alv.
* Sort para o ALV basico.
DATA it_sort_alv TYPE slis_t_sortinfo_alv.
* ActionW - Leonardo Fanhoni - 12.05.2011. - Final
* ALV layout OOP
DATA: gs_layout TYPE lvc_s_layo.
* ALV layout variant OOP
DATA: gs_variant TYPE disvariant.
DATA: gf_first_display TYPE c VALUE 'X'.
DATA: wa_sort TYPE lvc_s_sort,
it_sort TYPE lvc_t_sort.
* Constants
CONSTANTS: c_x(1) TYPE c VALUE 'X',
c_s TYPE c VALUE 'S',
c_e TYPE c VALUE 'E'.
DATA: gs_change TYPE flag.
DATA: gs_qtde(6) TYPE n.
DATA: gs_qtde_erros(6) TYPE n.
DATA msg(50) TYPE c.
DATA: f4_system_tab TYPE ussystem OCCURS 0 WITH HEADER LINE.
**********************************************************************
** SCREEN SELECTION
**********************************************************************
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETER p_qua1 RADIOBUTTON GROUP pad1 DEFAULT 'X' USER-COMMAND sap.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-010.
SELECT-OPTIONS:
so_user FOR ztbc045-bname MODIF ID b1, " Nome do usuário no mestre de usuários
so_date FOR ztbc045-datei MODIF ID b1, " Data atual do servidor de aplicação
so_land1 FOR ztbc045-land1 MODIF ID b1, " Chave do país
so_acao FOR ztbc045-acao MODIF ID b1. " AçãoSELECTION-SCREEN BEGIN OF LINE.
PARAMETER p_qua2 RADIOBUTTON GROUP pad1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-011.
PARAMETER: p_path TYPE rlgrap-filename MODIF ID b2. " OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b2.
INITIALIZATION.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
IF NOT p_qua2 IS INITIAL.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_PATH'
IMPORTING
file_name = p_path.
ENDIF.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 EQ 'B1' AND p_qua1 NE 'X'.
screen-input = '0'.
MODIFY SCREEN.
FREE: so_user,so_date,so_land1,so_acao .
ENDIF.
IF screen-group1 EQ 'B2' AND p_qua2 NE 'X'.
screen-input = '0'.
MODIFY SCREEN.
MOVE '' TO p_path.
ENDIF.
ENDLOOP.
START-OF-SELECTION.
IF p_qua2 EQ 'X' AND p_path IS INITIAL.
MESSAGE 'Nome do arquivo obrigatório' TYPE 'I' DISPLAY LIKE 'E'.
STOP.
ENDIF.
IF p_qua1 EQ 'X'.
CLEAR: t_ztbc045.
REFRESH: t_ztbc045.
PERFORM zf_carrega_dados.
CALL SCREEN 2000.
ELSE.
PERFORM import_from_excel_to_sap.
CHECK t_excel_ztbc045[] IS NOT INITIAL.
PERFORM grava_dados_zbc0045_log.
IF NOT t_log_erros[] IS INITIAL.
PERFORM monta_fieldcat.
PERFORM monta_alv_log_erros.
ENDIF.
ENDIF. " IF p_qua1 EQ 'X'
&---------------------------------------------------------------------
*& Form ZF_CARREGA_DADOS
&---------------------------------------------------------------------
* carrega tabela de registros
----------------------------------------------------------------------
FORM zf_carrega_dados .
SELECT *
FROM ztbc045
INTO TABLE t_ztbc045
WHERE bname IN so_user
AND datei IN so_date
AND land1 IN so_land1
AND acao IN so_acao.
SELECT * FROM ztbc045 INTO TABLE t_ztbc045 WHERE bname IN so_user AND datei IN so_date AND land1 IN so_land1 AND acao IN so_acao.
DESCRIBE TABLE t_ztbc045 LINES gs_qtde.
ENDFORM. " ZF_CARREGA_DADOS
Eu creio o preg_plit /(SELECT|select)\s(\)/ e ele sinaliza os SELECT que foram encontrados, porém eu quero pegar o comando inteireo desde o SELECT até o ponto (.) que é o final do comando select. Só que não manjo muito de ER. Se alguém tiver uma luz! :-)
Um grande abraço a todos e ótima semana.
Léo
Obrigado meu amigo! É isso mesmo.
Obrigado,
Léo
Pessoal, tenho um novo "problema" em relação a este tópico. Resolvi abri-lo novamente.
Eu tenho uma regra, a mais tensa, que diz para selectionar todos os SELECT e pegar todo o conteúdo dentro do ENDSELECT.
Por favor,
Tenho um SELECT como um looping no ABAP, e dentro deste looping eu tenho qualquer coisa, desde espaços em branco até asterísco.
SELECT * FROM TABELA WHERE TESTE='TESTE'.
if t_imp[] is initial.
message e000 with 'Não existem dados para esta seleção'.
endif.
sort t_imp by repre auart kunnr vbeln posnr vdatu.
clear w_flgnew.
loop at t_imp.
at new repre.
select single * from tvkbt
where spras = 'PT'
and vkbur = t_imp-repre.
clear repre.
repre = tvkbt-bezei.
reserve 60 lines.
endat.
reserve 8 lines.
at new auart.
move 'X' to w_flgnew.
endat.
if not w_flgnew is initial.
clear w_flgnew.
select single * from tvakt
where spras eq 'PT'
and auart eq t_imp-auart.
skip.
format color 4 intensified on.
write: / 'Tipo :'.
format color 2 intensified on.
write: 10 tvakt-bezei.
endif.
at new kunnr.
move 'X' to w_flgnew.
endat.
if not w_flgnew is initial.
clear w_flgnew.
select single * from kna1
where kunnr eq t_imp-kunnr.
skip.
format color 4 intensified on.
write: / 'Cliente:'.
format color 2 intensified on.
write: 10 t_imp-kunnr, kna1-name1.
endif.
* Este é um comentário com qualquer coisa...
if t_imp-abgru is initial.
format color 2 intensified off.
write: / t_imp-vbeln,
12 '/',
14 t_imp-posnr,
25 t_imp-arktx,
69 t_imp-audat,
83 t_imp-vdatu,
97 t_imp-edatu,
114 t_imp-bmeng,
135 t_imp-rfmng,
161 t_imp-cmgst,
174 t_imp-emfor,
180 ' '.
add t_imp-bmeng to qtde_cli_s.
add t_imp-rfmng to qtde_cli_a.
add t_imp-bmeng to qtde_tip_s.
add t_imp-rfmng to qtde_tip_a.
add t_imp-bmeng to qtde_repre_s.
add t_imp-rfmng to qtde_repre_a.
add t_imp-bmeng to qtde_geral_s.
add t_imp-rfmng to qtde_geral_a.
endif.
ENDSELECT.
Eu tenho que selecionar tudo que esta dentro do SELECT ENDSELECT. Estou tentando esta exp reg.
1. [^\*]\s\b(select|SELECT)(.*?)ENDSELECT
2. [^\*]\s{1,}(SELECT|select)\s{1,}\*?[^\.]+\.
3. [^\*]\s\b(select|SELECT)[^\*]{1,}ENDSELECT
Nenhuma delas esta pegando todo o conteúdo, sempre para em algum ponto! Alguém teria alguma idéia? tks
<pre><?php
$string = 'FORM zf_carrega_dados .
Resultado:
[]'s