Pedro Schneider

Um pouco sobre minha vida, trabalhos, estudos, diversões entre outros!

ORDER BY conforme tua necessidade no MYSQL

Muitas vezes já precisei fazer uma query para trazer um registro, caso não tenha, trazer outro, algumas vezes fiz com UNION e outras SUBQUERYs, sei que a query ficava gigante ou até mesmo “Gabiarrada”.

Mas dessa vez quis otimizar a query e pesquisei um pouco sobre, descobri para o MYSQL uma ótima solução!

Vejamos aqui o antes e o depois de uma query que busca os Banners conforme a seção do site, caso eu não tenha banner na seção produto, traz o da home!

SELECT * FROM site_banner b
JOIN mgr_secao_site ss ON b.SecaoSiteID = ss.SecaoSiteID AND ss.Url = "produto"
WHERE b.Ativo = 1 LIMIT 1
UNION
SELECT * FROM site_banner b
JOIN mgr_secao_site ss ON b.SecaoSiteID = ss.SecaoSiteID AND ss.Url = "home"
WHERE b.Ativo = 1 LIMIT 1

Não que a query acima não funcione, mas é que fica grande, olha só como solucionei usando o IN() e o FIELD():

SELECT * FROM site_banner b
JOIN mgr_secao_site ss ON b.SecaoSiteID = ss.SecaoSiteID AND ss.Url IN ( "produto", "home" )
ORDER BY FIELD( ss.Url, "' . $SecaoSiteUrl . '", "home" ) LIMIT 1;
posted by correaschneider in Desenv,Dicas,MySQL,SQL,Uncategorized and have No Comments

Estilização e Apresentação de Código

Hoje li um pouco sobre estilização e apresentação de código, e achei esse link:

http://en.wikipedia.org/wiki/Coding_conventions

Muito boa a leitura.

posted by correaschneider in Android,ASP,ASPX,Desenv,Dicas,HTML + CSS,Javascript,jQuery,MySQL,PHP,SQL and have No Comments

Dados para teste massivo!

Quantas vezes tu já se parou e pensou:

Para testar essa query vou ter que cadastrar um monte de dados, ah, que se foda, ta funcionando!

É amigos, eis a solução.

http://www.generatedata.com/

O negócio é em PHP, tu pode usar on-line ou fazer download.

Nesta segunda opção tu pode salvar o form!

Bom divertimento!

posted by correaschneider in Desenv,Dicas,MySQL,PHP,SQL and have Comment (1)

TagCloud para site!

Olá!

Hoje vou mostrar e disponibilizar aqui, uma library de TagCloud para CodeIgniter!

Como senti dificuldade para achar tag cloud para site, usando flash, comecei a desenvolver uma classe, como utilizo CodeIgniter, fiz uma para CodeIgniter. Podendo ser modificada para outras plataformas!

Bom vamos ao código!

Coloco os arquivos nos seus devidos lugares!

No Controller eu faço load da library, e como vou utilizar em todos os métodos, faço o load no construtor da classe Controller!

<?php
	class TagCloud extends CI_Controller {
		public function __construct() {
			parent::__construct();
 
			$this->load->library( 'TagCloud' );
		}

Após, crio os métodos para criar e configurar a TagCloud. O Exemplo aqui é uma das maneiras de montar o TagCloud!

		public function metodo3() {
			$tags = array(
					array( 'TagID' => '1', 'Tag' => 'Google', 'Url' => 'http://www.google.com.br/', 'Count' => '15' )
					, array( 'TagID' => '2', 'Tag' => 'Terra', 'Url' => 'http://www.terra.com.br/', 'Count' => '5' )
					, array( 'TagID' => '3', 'Tag' => 'UOL', 'Url' => 'http://www.uol.com.br/', 'Count' => '1' )
				);
 
			$this->tagcloud->setCampo( 'TagID' );
			$this->tagcloud->setLabel( 'Tag' );
			$this->tagcloud->setUrl( 'Url' );
 
			$this->tagcloud->setTags( $tags );
 
			$this->tagcloud->setUrlSite( 'http://www.phcs.com.br/' );
			$this->tagcloud->setUrlSite( site_url() );
			$this->tagcloud->setWidth( 270 );
			$this->tagcloud->setHeight( 270 );
			echo $this->tagcloud->mostrar();
		}

Os dados podem ser trazidos de banco, como mostra do Exemplo seguinte!

		public function metodo1() {
			echo $this->tagcloud->carregar( 'site_tag', 'TagID', 'Tag', 'Url', 'site_conteudo_site_tag' )->setUrlSite( 'http://www.phcs.com.br/' )->setPreUrl( 'http://www.phcs.com.br/tag/' )->setWidth( 270 )->setHeight( 270 )->mostrar();
		}

No zip, contém outras duas formas de configurar o TagClod!

Espero que tenha sido util!

Para fazer o download da classe, clique aqui!

posted by correaschneider in Desenv,Dicas,Javascript,MySQL,PHP and have No Comments

Android – Login com HttpClient, HttpPost, JSONObject!

Olá nesse meu primeiro post sobre Android, vou falar sobre a tela de login do meu App financeiro!

Bom vamos começar pelas Strings!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <?xml version="1.0" encoding="utf-8"?>
        <resources>
            <string name="hello">FinanzKontrolleDroid!</string>
            <string name="app_name">Finanz Kontrolle</string>
            <string name="txtNome">Nome</string>
            <string name="txtSenha">Senha</string>
            <string name="txtLogin">Login</string>
            <string name="btnLogar">Logar</string>
            <string name="msgSucessoLogin">Usuário logado! </string>
            <string name="msgPreenchaLogin">Preencha o Login</string>
            <string name="msgPreenchaSenha">Preencha a Senha</string>
            <string name="msgErroLogin">Erro ao logar!</string>
            <string name="msgErroConectar">Erro ao conectar ao servidor!</string>
            <string name="msgEmailSenhaInvalido">E-mail ou Senha inválido!</string>
            <string name="urlSite">http://10.1.1.2/Finanzkontrolle/Site/</string>
            <string name="urlLogin">android/login</string>
        </resources>

Criei essa tela, simples mas eficiente!

O xml é esse:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1">
        <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:inputType="textEmailAddress" android:id="@+id/txtLogin" android:hint="E-mail" android:text="@string/tempLogin">
            <requestFocus/>
        </EditText>
        <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:inputType="textPassword" android:id="@+id/txtSenha" android:hint="Senha"></EditText>
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btnLogar" android:id="@+id/btnLogin"></Button>
    </LinearLayout>

Esse é o Activity inicial deixei o código comentado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package finanz.kontrolle;
 
import finanz.kontrolle.Parametros;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class FinanzKontrolleDroidActivity extends Activity implements OnClickListener {
	private boolean logado = false;
 
	public void onCreate( Bundle savedInstanceState ) {
		super.onCreate( savedInstanceState );
		setContentView( R.layout.main );
 
		Button btnLogin = ( Button ) findViewById( R.id.btnLogin );
		btnLogin.setOnClickListener( this );
	}
 
	//Quando houver click na tela
	public void onClick( View arg0 ) {
		switch ( arg0.getId()  ) {
			// Verifica se é o botão de login
			case R.id.btnLogin:
					EditText txtLogin = ( EditText ) findViewById( R.id.txtLogin );
					EditText txtSenha = ( EditText ) findViewById( R.id.txtSenha );
 
					int mensagem = R.string.msgSucessoLogin;
 
					//Valida se os campos foram preenchidos
					if ( txtLogin.getText().length() <= 0 )
						 mensagem =  R.string.msgPreenchaLogin;
					else if ( txtSenha.getText().length() <= 0 )
						 mensagem =  R.string.msgPreenchaSenha;
					else //Em caso de sucesso, chama método logar
						mensagem = this.logar( txtLogin.getText().toString(), txtSenha.getText().toString() );
 
					//Mostra mensagem para usuário
					Toast t = Toast.makeText( this, mensagem, Toast.LENGTH_SHORT );
					t.setGravity( Gravity.CENTER, 0, 0 );
					t.show();
 
					if ( this.logado ) {
						//Se logado troca a tela
						Intent i = new Intent( FinanzKontrolleDroidActivity.this, MenuActivity.class );
						startActivity( i );
					}
				break;
		}
	}
 
	//Método para enviar o login para o PHP
	protected int logar( String mLogin, String mPassword ) {
		int mensagem = 0;
 
		String strUrl = getResources().getString( R.string.urlSite ) + getResources().getString( R.string.urlLogin );
 
		HttpClient httpclient = new DefaultHttpClient();
		HttpPost httppost = new HttpPost( strUrl  );
 
	    try {
	        List nameValuePairs = new ArrayList(2);
	        nameValuePairs.add(new BasicNameValuePair("Login", mLogin));
	        nameValuePairs.add(new BasicNameValuePair("Senha", mPassword));
	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
 
	        HttpResponse response = httpclient.execute(httppost);
 
	        StringBuilder retorno = this.inputStreamToString( response.getEntity().getContent() );
 
	        try {
				JSONObject jo = new JSONObject( retorno.toString() );
 
				 this.logado = false;
				if ( jo.getBoolean( "logged_in" ) ) {
					mensagem = R.string.msgSucessoLogin;
					this.logado = true;
 
					//Armazena o Nome e qual Banco do usuário
					Parametros par = Parametros.getInstance();
					par.setNome( jo.getString( "email" ) );
					par.setDatabase( jo.getInt( "banco" ) );
 
				} else if ( !jo.getBoolean( "logged_in" ) )
					mensagem = R.string.msgEmailSenhaInvalido ;
				else
					mensagem = R.string.msgErroConectar ;
			} catch (JSONException e) {
				mensagem = R.string.msgErroConectar;
			}
 
	    } catch (ClientProtocolException e) {
	    	mensagem = R.string.msgErroConectar;
	    } catch (IOException e) {
	    	mensagem = R.string.msgErroConectar;
	    }
 
	    return mensagem;
	}
 
	//Método que transforma InputStream para String
	private StringBuilder inputStreamToString(InputStream is) throws IOException {
	    String line = "";
	    StringBuilder total = new StringBuilder();
 
	    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
 
	    while ((line = rd.readLine()) != null)
	        total.append(line);
 
	    return total;
	}
}
posted by correaschneider in Android,Desenv,Dicas and have Comments (5)

Android

Nesse semestre na faculdade, estamos tendo aula de Android, vou começar a postar coisas sobre o mesmo, afinal estou desenvolvendo um App como trabalho de conclusão!

O objetivo do App, é controle financeiro!

Ainda não está conectando diretamente no banco, mas com tempo vou fazer essa alteração!

Como estamos desenvolvendo um controle financeiro na WEB, o App, envia os dados para o servidor PHP, esse faz o tratamento necessário, e retorna a resposta que o App vai estar esperando!

Vou postar minhas dificuldades e meus sucesso!

posted by correaschneider in Android,Desenv,MySQL,PHP and have No Comments

Group_Concat do SQLServer

Anteriormente foi falado em Relacionando Tabelas N:N na query de consulta. Só que só funciona em MySQL. Dai tu me pergunta:

– Como faz em SQLServer?

Te respondo assim:

DECLARE @x VARCHAR(8000)
SELECT @x = COALESCE(@x + ', ','') + ISNULL(CONVERT(VARCHAR,CampoTabela),'') FROM Tabela WHERE ChavePrimaria IN (1,2,3,4)
SELECT @x
posted by correaschneider in Desenv,Dicas,SQL and have No Comments

SoftwareLivreVS

Venha participar do III Festival de Software Livre do Vale do Sinos em
Novo Hamburgo, uma oportunidade para conhecer mais a filosofia e
tecnologias livres que dominam a cena da informática.

III Festival de Software Livre do Vale do Sinos
———————————————–
* Data: 20 de novembro de 2010 (sábado)
* Hora: 13h às 17h
* Local: Fundação Evangélica de Novo Hamburgo (IENH)
* Público Alvo: usuários de computador em geral, educadores,
estudantes e profissionais de informática que queiram conhecer o
Software Livre e/ou participar da comunidade de Software Livre da
região. Não é necessário ter experiência com Software Livre para
participar.
* Investimento: evento gratuito

Mais informações
—————-
* http://wiki.softwarelivre-vs.org/

Programação
———–
* Open Spaces
* Festa de Assinatura de Chaves OpenPGP
* Palestras nas seguintes áreas:

* Desenvolvimento
* Ruby on Rails – Filosofia e Prática
* Liberte-se com Python

* Redes
* Computação nas nuvens, virtualização e software livre – Como
eles caminham juntos

O Que é Software Livre
———————-
Software Livre se refere à liberdade dos usuários executarem,
copiarem, distribuírem, estudarem, modificarem e aperfeiçoarem o
software.

Sobre o SoftwareLivreVS
———————–
O grupo de usuários SoftwareLivreVS é um grupo de pessoas que usam
Software Livre na região do Vale do Sinos. Nós divulgamos o Software
Livre e convidamos as pessoas a fazerem parte de nosso grupo. Para
saber mais, entre na nossa página na Internet em
http://www.softwarelivre-vs.org/

posted by correaschneider in Desenv,Dicas,Diversos,Linux,MySQL,PHP and have No Comments

Relacionando Tabelas N:N na query de consulta

SELECT `dmCanal`.`Descricao`
FROM `PessoaCanal`
INNER JOIN `dmCanal` ON `PessoaCanal`.`CanalID` = `dmCanal`.`CanalID`
WHERE `PessoaCanal`.`PessoaID` =  40

Resultado:

Utilizando a query acima deve-se utilizar com a função group_concat()

Ex:

SELECT
`Pessoa`.`PessoaID`,
(
SELECT GROUP_CONCAT(`dmCanal`.`Descricao`)
FROM `PessoaCanal`
INNER JOIN `dmCanal` ON `PessoaCanal`.`CanalID` = `dmCanal`.`CanalID`
WHERE `PessoaCanal`.`PessoaID` =  `Pessoa`.`PessoaID`
) AS Canais
FROM
`Pessoa`

Resultado:

posted by correaschneider in Desenv,Dicas,MySQL and have No Comments