Função SQL Server

SQL Server

PHP

08/06/2015

Pessoal, como faço para tratar uma função do SQL e retornar dados para o PHP?
Guilherme Silva

Guilherme Silva

Curtidas 0

Melhor post

Marcos P

Marcos P

10/06/2015

$query = "create table #turno (CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT)
    insert #turno
    SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')
    select * from #turno
    IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno";

Essas queries não podem ser executadas juntas no PHP !

A função "V_RELOGIO_PONTO", retorna os dados do select que você precisa, mas a última query executada nesse batch ( IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno ), não retorna dados e isso está travando teu código PHP...

Execute, no PHP, apenas... SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE').

Se funcionar, você vai ter de ajustar o uso da temporária ( #turno ), que a principio não tem nada a ver com a função ( V_RELOGIO_PONTO ) !
GOSTEI 1

Mais Respostas

Marcio Araujo

Marcio Araujo

08/06/2015

Maca, me desculpe, não entendi bem sua dúvida.
GOSTEI 0
Guilherme Silva

Guilherme Silva

08/06/2015

Então Marcio, eu tenho uma função dentro do SQL Server que faz várias consultas de turnos, café, almoço, janta e ceia.. que está assim:
SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')

ela faz vários if's e selects, no caso ai ta consultando tudo que for resumo do cafe da manha... mas nao sei como colocá-la no PHP e trazer os registros entende.. me deram a ideia de usar tabela temporária, até fiz, mas não consigo passar os dados para a array... Nota: a função [dbo].[V_RELOGIO_PONTO] funciona perfeitamente quando jogo no SQL Server.

$query = $DBH->prepare("create table #turno (CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT)
insert #turno
SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')
select * from #turno
IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno");
$query->execute();
$result = $query->fetchAll();
print_r($result);

Hoje eu to usando só o print_r, pq tentei passar para arrays mas nao me retornou nada.. Do jeito que está ai, o chrome me retorna a seguinte resposta: Array ( ).
Eu tinha comentado o print_r, e abaixo da $result eu coloquei assim:
$row = fetch($query);
$cracha = $row['CRACHA_1'];
$nome = $row['FUNCIONARIO']; e as demais colunas... mas ai o chrome mostra: Fatal error: Call to undefined function fetch() in ...

Se eu dou um echo na $query, traz: Catchable fatal error: Object of class PDOStatement could not be converted to string in ... E se eu dou um var dump($DBH) aparece: object(PDO)#1 (0) { }.

A minha dúvida é como fazer o php entender os registros que a função SQL mostra.. Se puder ajudar, agradeço.
GOSTEI 0
Marcio Araujo

Marcio Araujo

08/06/2015

Maca, me desculpa, mas situação foge do meu conhecimento, vamos aguardar alguem com experiencia no PHP e SQL Server.
GOSTEI 0
Guilherme Silva

Guilherme Silva

08/06/2015

Ok Marcio obrigado pela atenção!!

Até estou progredindo, estou quase lá.. dei alguns debugs no código assim:
$row = array();
print_r ( $pdo -> errorInfo ( ) ) ; -> esse aqui é o primeiro debug
$pdo -> setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ) ; -> ai depois esse
$res = $pdo->query($query);
//$res->nextRowset();

while($row = $res->fetch(PDO::FETCH_ASSOC)) {
$cracha = $row['CRACHA_1']; e demais variaveis...

Ai retorna assim: Array ( [0] => [1] => [2] => )
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[IMSSP]: The active result for the query contains no fields.' in C:\xampp\htdocs\consulpon\cafe.php:49 Stack trace: #0 C:\xampp\htdocs\consulpon\cafe.php(49): PDOStatement->fetch(2) #1 thrown in C:\xampp\htdocs\consulpon\cafe.php on line 49

Agora eu vi que diz não ter nada nas colunas.. mas tem, pq quando jogo (somente a função) no sql server funciona certinho sem alterar uma vírgula.. Quem puder ajudar agradeço.
GOSTEI 0
Marcos P

Marcos P

08/06/2015

Sempre que postar código, procure utilizar a tag (Inserir Código ). Isso facilita, em muito, a compreensão do seu código !

Qual o tipo de objeto você criou no Sql Server ?

Poderia colocar aqui o script de criação desse objeto no banco ?

Poderia colocar, ainda, um exemplo da execução disso no Sql Server ? Tanto o comando submetido ao banco, quando ao resultado obtido...
( pode ser uma imagem... )

Esse código fonte em PHP faz acesso a outros objetos do banco de dados ? Uma tabela ou precedure por exemplo ?

Você tentou basear a chamada a essa ( dita ) função, utilizando a mesma estrutura desses eventuais outros comandos ?
( afinal, eles também retornam registros... )
GOSTEI 0
Guilherme Silva

Guilherme Silva

08/06/2015

Oi Marcos.. Desculpe, vou usar o <code> agora.. Então, no teste que estou fazendo, meu script todo está assim:

<?php 

$myServer = "192.168.0.99";
$myUser = "sa";
$myPass = "sa";
$myDB = "vetorh_ponto"; 

try {
  # MS SQL Server and Sybase with PDO_DBLIB
  $pdo = new PDO("sqlsrv:server=$myServer;database=$myDB", $myUser, $myPass);

if( $pdo ) {
     echo "";
}else{
     echo "Nao conectou.<br />";
     die( print_r( sqlsrv_errors(), true));
}

}
catch(PDOException $e) {
    echo $e->getMessage();
}


$query = "create table #turno (CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT)
	insert #turno
	SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')
	select * from #turno
	IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno";
	$row = array();
	print_r ( $pdo -> errorInfo ( ) ) ; 
	$pdo -> setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ) ; 
	$res = $pdo->query($query);
	//$res->nextRowset();
	
	while($row = $res->fetch(PDO::FETCH_ASSOC)) {
		$cracha = $row['CRACHA_1']; // e demais colunas .....
	}
	echo $cracha; // e demais colunas ......
	
	//echo $query;
	//var_dump($pdo);
?>


No Sql Server, eu só rodo esse comando dentro da variavel $query, e ele traz os registros conforme a imagem abaixo:

[img]http://arquivo.devmedia.com.br/forum/imagem/434904-20150610-081436.png[/img]

E esse código faz acesso a várias tabelas a partir dessa função [dbo].[V_RELOGIO_PONTO], de dois bancos diferentes.. Mas acho que "bancos diferentes" nao vem ao caso, só preciso fazer o PHP entender essa função e retornar os registros.. Mexi mais um pouco ontem, e do jeito que está ai, me retorna a seguinte mensagem:
Array ( [0] => 01000 [1] => 5701 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Changed database context to 'vetorh_ponto'. ) 
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[IMSSP]: The active result for the query contains no fields.' in C:\xampp\htdocs\consulpon\cafe.php:49 Stack trace: #0 C:\xampp\htdocs\consulpon\cafe.php(49): PDOStatement->fetch(2) #1  thrown in C:\xampp\htdocs\consulpon\cafe.php on line 49


O que acha que pode ser Marcos?
GOSTEI 0
Marcos P

Marcos P

08/06/2015

Qual tipo de objeto é V_RELOGIO_PONTO no Sql Server ?

Consegue postar o script de criação desse objeto no banco ?

Qual a relação desse objeto e a temporária #turno e por que você populou essa tabela na mesma query que evocou V_RELOGIO_PONTO ?

As autorizações de acesso a esses objetos, tanto para execução de V_RELOGIO_PONTO, como para criação e manipulação de #turno, estão liberadas para o usuário de banco que você usa para conectar pelo PHP ?

A temporária #turno, pode ser substituída por uma tabela permanente ( mesmo que seja apenas para finas de teste ) ?

Essas instruções precisam ser geradas todas juntas, principalmente do lado do PHP ?

Você consegue gerar uma-a-uma, identificando o ponto exato em que ocorre o problema ?

Outras funções nativas do banco, você consegue acessar no PHP ? Por exemplo :

select getdate()
GOSTEI 0
Guilherme Silva

Guilherme Silva

08/06/2015

Marcos, vamos lá.. Na verdade não manjo muito sobre objetos e demais coisas no SQL Server.. Essa função v.relogio_ponto foi um outro rapaz que fez, mas enfim.. só pra você saber..
Se com objeto você diz ser a função completa do SQL, aqui vai:

USE [vetorh_ponto]
GO
/****** Object:  UserDefinedFunction [dbo].[V_RELOGIO_PONTO]    Script Date: 06/08/2015 15:49:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[V_RELOGIO_PONTO] (@TIPO CHAR(7))
returns @TABELA table
( CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, 
  CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT                   )
AS
BEGIN
	DECLARE @CAFE_INI int, @CAFE_FIM int,
			@ALMOCO_INI int, @ALMOCO_FIM int,
			@JANTAR_INI int, @JANTAR_FIM int,
			@CEIA_INI int, @CEIA_FIM int,
			@INICIO DATETIME, @FIM DATETIME

	SET @CAFE_INI   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CAFE_INI') 
	SET @CAFE_FIM   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CAFE_FIM')
	SET @ALMOCO_INI = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_ALMOCO_INI')
	SET @ALMOCO_FIM = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_ALMOCO_FIM')
	SET @JANTAR_INI = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_JANTAR_INI')
	SET @JANTAR_FIM = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_JANTAR_FIM')
	SET @CEIA_INI   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CEIA_INI')
	SET @CEIA_FIM   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CEIA_FIM')
	SET @INICIO = (SELECT CAST(cnf_valor AS datetime) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_DATA_INI') 
	SET @FIM    = (SELECT CAST(cnf_valor AS datetime) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_DATA_FIM')


if @tipo = 'CAFE'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CAFE_INI and @CAFE_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RCAFE'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CAFE_INI and @CAFE_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) A GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1


if @tipo = 'ALMOCO'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @ALMOCO_INI and @ALMOCO_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RALMOCO'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @ALMOCO_INI and @ALMOCO_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) B GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1



if @tipo = 'JANTAR'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @JANTAR_INI and @JANTAR_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RJANTAR'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @JANTAR_INI and @JANTAR_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) C GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1


if @tipo = 'CEIA'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CEIA_INI and @CEIA_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RCEIA'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CEIA_INI and @CEIA_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) D GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1

RETURN

END



As alterações devem estar liberadas, creio eu, pois estou com o usuário 'sa'.. essa temporária #turno, fiz pois um amigo me indicou procurar sobre tabelas temporárias para trabalhar com essa função, e então hoje está assim o código.. Sim, para teste podemos também migrar para uma tabela permanente esses dados.. Não sei te dizer se todas as instruções precisam estar juntas pois comecei com o PDO agora.. Por isso tenho ainda essas dúvidas

Não cheguei a testar separado

Sim, o getdate funcionou.
Usei
print_r(getdate());

Que trouxe
Array ( [seconds] => 20 [minutes] => 44 [hours] => 16 [mday] => 10 [wday] => 3 [mon] => 6 [year] => 2015 [yday] => 160 [weekday] => Wednesday [month] => June [0] => 1433947460 )
GOSTEI 0
Guilherme Silva

Guilherme Silva

08/06/2015

Marcos, não sei se é exatamente o que você disse.. Eu executei assim:
try {
  # MS SQL Server and Sybase with PDO_DBLIB
	$pdo = new PDO("sqlsrv:server=$myServer;database=$myDB", $myUser, $myPass);
	if( $pdo ) {
		 echo "";
	}else{
		 echo "Connection could not be established.<br />";
		 die( print_r( sqlsrv_errors(), true));
	}

$query = "SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')";
     print_r ($pdo -> errorInfo()); 
    $res = $pdo->query($query);
    echo $res;
		
}catch(PDOException $e) {
	echo $e->getMessage();
}

Mas meu retorno foi esse:
Array ( [0] => 01000 [1] => 5701 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Changed database context to 'vetorh_ponto'. ) 
Catchable fatal error: Object of class PDOStatement could not be converted to string in C:\xampp\htdocs\consulpon\cafe.php on line 20

Precisava ver primeiro como fazer trazer os dados nessa array para posteriormente se for o caso, jogar em tabela temporária.. Na verdade o erro possivelmente pode estar nas linhas abaixo da query, como nesse $pdo->query($query) ou o echo $res, os quais eu não sei dizer se estão corretos..
GOSTEI 0
Marcos P

Marcos P

08/06/2015

Valide o tipo de todas as colunas retornadas pela função e a declaração de seu array, pois parece que está ocorrendo conflito de tipo ( Object of class PDOStatement could not be converted to string ).

Sua ideia é jogar os dados em uma temporária... porque você não faz isso dentro da própria função, retornando os dados em uma tabela fixa, com identificação do usuário que rodou a query ?
( para você pode isolar os dados corretos, na sessão corrente do PHP )

Tenho vários códigos PHP que carregam arrays com queries do Sql Server e, estando todos os tipos certos, nunca tive maiores problemas...
( no exemplo abaixo, a carga de uma grid com vários registros )

$SQL = "select NroFatura,convert(char,Vencimento) as Vencimento, convert(char,VencBloq) as VencBloq from faturas where codcliente = ".$_SESSION["codcli"]." and StatusBaixa = 'A' and tipodoc = 1 and VencBloq is not null order by Vencimento desc";			

$result = mssql_query($SQL);
  
if (!$result) {
     echo "<script> alert('Erro ao selecionar faturas!');</script>";
     $url = "logout.php";
     $delay = "0";
     echo '<meta http-equiv="refresh" content="'.$delay.';url='.$url.'">';
     exit;
}

$total = mssql_num_rows($result);		

if ($total > 0){

echo "<tr>".
"<td colspan=\"5\" rowspan=\"1\" align=\"left\" style=\"height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Faturas em Aberto com 2.a Via Emitida</font></td>".
"</tr>".
"<tr>".
"<td style=\"width: 80px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Nº Fatura</font></td>".
"<td style=\"width: 130px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Venc. Original</font></td>".
"<td style=\"width: 130px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Venc. 2.Via</font></td>".
"<td style=\"width: 130px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Valor 2.Via</font></td>".
"<td style=\"width: 120px; height: 8px; background-color: rgb(255, 255, 255); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\"></font></td>".
"</tr>";

while($dados = mssql_fetch_array($result))
{
	selDados($dados["NroFatura"]);
	echo "<tr style\"background-color: rgb(255, 255, 255);\">";
	$auxstr = "<td style=\"width: 80px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">".$dados["NroFatura"]."</font></td>";
  echo $auxstr;
	$auxstr = "<td style=\"width: 130px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">".$dataant."</font></td>";
  echo $auxstr;
  $auxstr = "<td style=\"width: 130px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">" .$vencbloq. "</font></td>";
  echo $auxstr;
  $auxstr = "<td style=\"width: 130px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">" .$valorant. "</font></td>";
  echo $auxstr;
  $auxstr = "<td style=\"width: 120px; height: 8px; background-color:rgb(255, 255, 255);\" ><font size=\"2\"><input style=\"width: 80px;\" class=botao name=\"".$dados["NroFatura"]."\" value=\"Reimprimir\" type=\"button\" onclick=\"emitir(this.name,'{$vencbloq}');\"></font></td>";
  echo $auxstr;  
  
  echo "</tr>";
}
GOSTEI 1
Guilherme Silva

Guilherme Silva

08/06/2015

Legal Marcos.. Vou testar hoje quando tiver um tempo e amanhã escrevo aqui sobre os retornos.. Muito obrigado pela atenção até agora.. Até amanhã o/
GOSTEI 0
Guilherme Silva

Guilherme Silva

08/06/2015

Prezados, bom dia!

Fiz algumas mudanças no código e consegui parcialmente o que queria! Segue o código modificado abaixo:

<?php 
include "conn.php";

	$sql = "SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('CAFE')";
    $stmt = sqlsrv_query( $conn, $sql );
	if( $stmt === false) {
		die( print_r( sqlsrv_errors(), true) );
	}
	while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
		$id = $row["CRACHA_1"];
		$nome = $row["FUNCIONARIO"];
		$setor = $row["SETOR"];
		$cevento = $row["CODIGO_EVENTO"];
		$evento = $row["NOME_EVENTO"];
		$total = $row["TOTAL"];
		
		echo $id;
		echo $nome;
		echo $setor;
		echo $cevento;
		echo $evento;
		echo $total."<br>";
	}
?>


Está bem crú em tela, mas traz todos os registros de acordo com o que peço na função, se é CAFE, RCAFE, ALMOCO, JANTA, CEIA... Enfim..
Marcos, sabe me dizer se do jeito que fiz, se esse sqlsrv_query está ultrapassado?
Eu cansei de usar o PDO porque se mudava uma vírgula, mudava o retorno --' , seja string, contexto do banco, ou Array ( [0] => 01000 [1] => 5701 [2]... ai cada hora eu ficava procurando no google sobre algum erro, e só ficava dando voltas..
GOSTEI 0
Marcos P

Marcos P

08/06/2015

Se funciona... não está ultrapassado !

Mas existem outros métodos de acesso a dados no Sql Server, via PHP... é questão de pesquisar.
GOSTEI 0
Guilherme Silva

Guilherme Silva

08/06/2015

Entendi.. É que por exemplo, se você usar o mysql_query no XAMPP, roda normal.. Se você usar no WAMP, ele diz que está ultrapassado, e que deve ser usado o mysqli_query entende.. Assim, só pra saber mesmo, se continuará funcionando daqui um tempo..

Mas beleza, depois vou até testar usando o mssql_query igual você, pelo visto esse também traz os dados normalmente..
Marcos, muito obrigado pela ajuda! Primeira vez que pergunto em um fórum e foi de grande valia!

Pra quem tiver esse problema, mais um caso de "Resolvido"... Abraços!
GOSTEI 0
Marcos P

Marcos P

08/06/2015

Toda ajuda é bem vinda !

Se você puder continuar por aqui, participando... seria legal !

T+
GOSTEI 0
POSTAR