Pesquisar neste blog

Mostrando postagens com marcador Linguagem de Programação 1. Mostrar todas as postagens
Mostrando postagens com marcador Linguagem de Programação 1. Mostrar todas as postagens

21/09/2024

Gerar PDF do google docs e salvar na mesma pasta do drive

Código feito em JavaScript

function ExportGoogleDocAsPDF() {
  // Obtém o ID do documento atual
  var docId = DocumentApp.getActiveDocument().getId();
 
  // Obtém o arquivo do Google Drive usando o ID do documento
  var file = DriveApp.getFileById(docId);
 
  // Converte o documento em PDF
  var pdfBlob = file.getAs('application/pdf');
 
  // Obter a pasta do Google Drive onde o documento está localizado
  var folder = file.getParents().next(); // Obtém a pasta pai do arquivo
 
  // Salva o PDF na mesma pasta com o mesmo nome do documento, mas com extensão .pdf
  folder.createFile(pdfBlob).setName(file.getName() + ".pdf");
 
  Logger.log("PDF gerado e salvo na mesma pasta do Google Drive.");
}


20/03/2020

Prova LP 2 - 2019/2

Prova aplicada em 24/10/2019

1) Dado uma hierarquia de classes mapeadas em uma modelagem de um software, com vistas ao reuso de código, o que deve ser levado em consideração para a decisão do uso de herança de implementação (extends) ou de agregação/composição para promover o reuso ? ( 0,5 )

RESP:

Deve ser levado em consideração o uso em tempo de compilação e o uso em tempo de execução.
Para o uso em tempo de compilação a herança (extends) resolve o problema, para a agregação/composição que é herança de tipo ou uso em tempo de execução resolve o problema.



2) Tipos genéricos podem ser definidos por meio de classes abstratas ou interfaces. Estabeleça as diferenças entre o uso de classes abstratas ou interfaces na implementação de tipos genéricos ? ( 1,0 )

RESP:

Classes abstratas:
+ As classes abstratas força a hierarquia para as subclasses.
+ Seu contrato faz com que as subclasses contemplem as mesmas hierarquias e/ou padrões.

- Classes abstratas não podem ser instanciadas
- Deve conter pelo menos um método abstrato
- Classes abstratas serve apenas para ser herdado

Interface
+ Uma classe pode implementar diversas interfaces
+ Interface não possui implementação, apenas assinatura

- Interface não pode ser instanciada e nem como criar um construtor


3) Como é possível um tipo ser implementado por mais de uma classe ? ( 1,0 )

RESP:

É possível através de interfaces, se uma classe A é do tipo I1, se a classe B é do tipo I2 e se a classe A fazer uma herança (extends) de classe B, logo; podemos dizer que a classe A é do tipo I1 e do tipo I2.

4) Por que é conveniente que um cliente de um objeto não conheça a(s) classe(s) que pode(m) produzir os objetos para ele ? Como isso é possível ? ( 0,7 )

RESP:

Porque é necessário que as classes sejam implementadas por interfaces para adicionar todos os métodos da classe, ou que essa classe se transforme em uma herança.
  • É possível através de interfaces que esconde os métodos da classe.


5) Qual a finalidade da API JDBC do java ? ( 0,7 )

RESP:

Porque é necessário que as classes sejam implementadas por interfaces para adicionar todos os métodos da classe ou que essa classe se transforme em uma herança 
  • É possível através de interfaces que esconde os métodos da classe


6) Como é possível uma aplicação Java acessar mais de um tipo de SGDB de forma flexível (com pouca alteração) por meio da API JDBC ? ( 1,0 )

RESP:

É possível usando um driver JDBC para se comunicar diretamente com uma fonte de dados específica, caso não tenha um driver JDBC é necessário que tenha pelo menos um driver ODBC.

7) Existem quatro tipo de driver JDBC, qual é o mais recomendado ? Porque ? ( 1,0 )

RESP:

Pure Java, tipo 4
  • Porque os drivers se comunicam diretamente com o Banco de Dados usando soquetes de rede
  • Porque não requer código adicional do Java

8 - Considere o trecho de código a seguir e responda as questões ? ( 0,7 )

package apps;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Conexao1{
    public static void main(String args[]){
        Connection conexao;
        String url = "jdbc:postgresql://localhost:5432/produto";
        String usr = "postgresql";
        String pass = "postgresql";
        
        try{
            Class.forName("org.postgresql.Driver");
            conexao = DriverManager.getConnection(url, usr, pass);
            System.out.println("Conexão estabelecida");
            conexao.close();
            System.out.println("Conexão encerrada");
        }catch (ClassNotFoundException cnf){
            System.out.println("Classe do driver não encontrado - "+cnf.getMessage());
            
        }catch (SQLException sqle){
            System.out.println("Conexao não estabelecida - "+sqle.getMessage());
        }
    }
}

a) Descreva quais são as informações presentes na URL de conexão JDBC ?

RESP:


b) Qual o papel da classe DriverManager ?

RESP:

Realizar a conexão com o banco de dados da fonte específica PostgreSQL usando a URL, USR(usuário) e o pass(senha)

c) Qual a finalidade da Interface / objeto Connection na manipulação de banco de dados por meio da JDBC ?

RESP:

Ser como uma forma de ponte para estabelecer a conexão com o Banco de Dados.

d) O que é realizado no trecho de código, caso ão ocorra exceções ?

RESP:

É feita uma conexão de curto tempo com a fonte específica PostgreSQL e em seguida é finalizado a conexão

9) Considere os trechos de código a seguir e responda as questões. ( 1,0 )

Código 01

Connection conexao = FabricaConexao.obterConexao();
PreparedStatement comando = null;
String nome = "Refrigerantes";
float promocao = 0;
float margem = 50;

try{
    comando = conexao.preparedStatement("INSERT INTO GRUPOPRODUTO (NOME, PROMOCAO, MARGEMLUCRO) VALUES (?, ?, ?)");
    comando.setString(1, nome);
    comando.setFloat(2, promocao);
    comando.setFloat(3, margem);
    comando.executeUpdate();
    System.out.println("Inclusão realizada com sucesso");
    
}catch (SQLException ex){
    System.out.println("Erro ao incluir grupo de produto"+ex.toString());
} finally {
    try{
        comando.close();
        conexao.close();
    }catch (SQLException ex){
        System.out.println("Erro ao desconectar"+ex.toString);
    }
}

Código 02

Connection conexao = FabricaConexao.obterConexao();
PreparedStatement comando = null;
String sql = "Refrigerantes";
String nome = "Bebidas destiladas";
float promocao = 10;
float margem = 50;

sql += "('"+ nome +"', "+promocao+", "+margem+")";

try{
    comando = conexao.reateStatment();
    comando.executeUpdate(sql);
    System.out.println("Inclusão realizada com sucesso");
    
}catch (SQLException ex){
    System.out.println("Erro ao incluir grupo de produto"+ex.toString());
} finally {
    try{
        comando.close();
        conexao.close();
    }catch (SQLException ex){
        System.out.println("Erro ao desconectar"+ex.toString);
    }
}

a) Existe diferença funcional entre os dois trechos de código ? Justifique.

RESP:

Não existe diferença funcionais entre o código 1 e o código 2, porém o código 1 é mais recomendado.

b) Existe diferença de implementação entre os trechos de código ? Justifique.

RESP:

Existe diferença de implementação entre os 2 códigos, o código 01 utiliza o PreparedStatmente para realizar a inserção, já o código 02 utiliza uma String SQL que é menos recomentada.

10) Analise o trecho de código a seguir e responda as questões. Considere que a FábricaConexao é uma classe utilitária que devolve um objeto Connection instanciado.  (0,8 )

Connection conexao = FabricaConexao.obterConexao();
PreparedStatement comando = null;

try{
    comando = conexao.preparedStatement("SELECT *FROM grupoproduto ORDER BY nome");
    ResultSet resultado = comando.executeQuery();
    while (resultado.next()){
        System.out.println("Codigo: "+resultado.getInt("codigo"));
        System.out.println("Nome: "+resultado.getString("nome"));
        System.out.println("% Promocao: "+resultado.getFloat("promocao"));
        System.out.println("% Margem lucro: "+resultado.getFloat("margemlucro"));
        System.out.println("---------------------------------------------------");
    }
    resultado.close();
}catch (SQLException ex){
    System.out.println("Erro ao recuperar os grupos de produtos"+ex.toString());
} finally {
    try{
        comando.close();
        conexao.close();
    }catch (SQLException ex){
        System.out.println("Erro ao desconectar"+ex.toString);
    }
}

a) O que o código realiza (linhas gerais) ?

RESP:
  • Realiza a conexão com o banco de dados
  • Faz uma seleção de tudo do grupoproduto ordenado em forma crescente por nome
  • É processado e executado o resultado
  • Enquanto haver dados em ResultSet
  • Exibe o código
  • Exibe o nome
  • Exibe a promoção
  • Exibe a margem de lucro
  • É finalizada e fechada o resultado
  • Caso ocorra erro de comando, irá exibir ERRO e os dados do grupo
  • Finalizar a conexão com o Banco de Dados
  • Caso ocorra um erro de conexão com Banco de Dados, irá exibir a mensagem de erro SQL


b) O que é o objeto ResultSet ? Qual a sua finalidade ?

RESP:

Coletar informação de linhas de comandos SQL e processa -lá.
  • Sua finalidade é ser como um objeto de referência para realizar os comandos SQL

13/12/2019

PostegreSQL / PGAdmin no Java

O objetivo desta atividade é a modelagem do banco de dados e o desenvolvimento de um sistema para controle e gerenciamento de torneios de tênis de mesa. Um torneio dever ter um nome, uma data de início/fim e o endereço onde será realizado, além de dados de contato do administrador do torneio (e-mail e telefone). Um torneio é composto por diversos Eventos, que por sua vez podem filtrar os participantes com base em diversos critérios:


  • a. individual ou duplas; 
  • b. sexo: masculino, feminino ou sem restrição de sexo; 
  • c. por idade: Rating (baseado na data de nascimento do jogador) define um intervalo de idade permitido neste evento; 


  • d. pelo nível de jogo: Ranking (pontuação acumulada do jogador que define a qualidade do seu jogo) onde será definido um intervalo pelo qual o participante poderá disputar. Esses critérios podem ser cumulativos ou não, ou seja, pode haver eventos individuais com restrição de ranking mas sem restrição de sexo e rating, da mesma forma que pode ter evento de duplas com restrição de sexo e rating mas sem restrição de ranking. No Evento deve ser possível ainda definir o modelo de disputa que poderá variar entre: disputa em grupos GR, eliminação simples ES ou uma combinação entre grupos e eliminação simples. Deve ser permitida a definição do tamanho dos grupos e a formatação das chaves de eliminação quando, houverem não houverem quantidade suficiente de participantes para a formatação dos grupos de forma homogênea (grupos de 3, 4 ou 5 jogadores) ou para a definição das chaves de mata mata (ES) quando a quantidade de jogadores não for múltiplo de 2. Deve ainda ser permitido ao sistema realizar a impressão dos grupos e chaves de eliminação simples em formato impresso e digital. Por fim deve ser possível fazer o controle financeiro das inscrições dos jogadores nos Eventos dos Torneios. As informações acima descritas servem apenas para dar um norte inicial aos trabalhos, segue abaixo mais links de informações para melhor entendimento do objeto a ser analisado, que pode se deve ser ampliado, conforme maior maturidade no ambiente de negócio do cliente.

















Resolução:

































Informações da caixa de diálogo








Informações incluídas







































Simulando jogo






































Dados incluídos no Banco de Dados







































Clique aqui para fazer o download do arquivo feito em Java e no PostegreSQL

06/11/2019

Atividade LP2

1. Qual a justificativa/vantagem do uso de enumerações, ao invés de usar valores literais ou constantes do tipo String ou Inteiro ?

- define um domínio de valores
- define um tipo em tempo de compilação
- toda manipulação pelo enum é validada pelo compilador
- diminui a chance do compilador parar
- legitimidade 

2. Qual o papel das classes VO’s na implementação fornecida ?

- ENTIDADE: endereco, Aluno, Enuns =: abstracao de classes / X
- DAO: Conexao => reuni o papel de banco de dados / ABSTRACAO DE PERSISTENCIA / quem ficar isolado nesta expressão encapsula os campos
- EXCEÇÕES => Persisntencia, Negocio / X - não reuni um conjunto de ações 
- NEGOCIO => Validação de dados / ABSTRACAO de mooder 
- EXECUCAO: Principal- Visao/Intidade=> Faz o papel de interação com o usuário / fazer a interface com o usurário para fornecer dados


3. Caso não seja usado VO, como seriam passados valores entre as classes da visão, negócio e persistência ?

- Por Lista de parâmetros

4. Que tipo de relação existe entre o VO de Aluno e Endereço ?

- Agregação de endereçosVO

5. O que justifica o uso do EnderecoVO na implementação, haja visto que no banco de dados existe apenas uma tabela (Aluno) ? 

- Complexidade nas classes
- Fazer um registro com chave primaria que referencia 2 ou + tabelas

6. Aponte exemplos de uso da classe PersistenciaException. 



7. Qual o benefício de criar uma classe para tratar a conexão com o banco de dados, como a classe ConexaoBD ? 

- é uma classe de apoio utilitária
- encapsulamento de um local da conexão
- diminui o uso de código com repetição

8. Qual o papel/responsabilidade da classe DAO ?

- DAO reunir todos

 9. Qual o papel/responsabilidade da classe AlunoNegocio ? 

- Consistência da regra de negocio
- envolve validação de dados

10. Caso tenha que inserir uma nova entidade/conceito na aplicação, quais seriam as classes a serem implementadas ?

- Construir um professorDAO
- AlunoDAO e assim sucessivamente
- AlunoNegocio 

13/07/2019

Threads usando com Java

Crie um semáforo (sinal de trânsito) usando Threads. O semáforo deve ficar verde por x segundos, depois brevemente amarelo seguido de y segundos na cor vermelha.

Resolução:
Enun CorSemafaro
/**
 *
 * @author HENRIQUE
 */
public enum CorSemafaro {
    //VERDE, AMARELO, VERMELHO;
 
    //opcional
    VERDE(1000), AMARELO(300), VERMELHO(2000);//
    private int tempoEspera;//

    private CorSemafaro(int tempoEspera) {//
        this.tempoEspera = tempoEspera;//
    }
    public int getTempoEspera() {//
        return tempoEspera;//
    }
}

Classe ThreadSemaforo

public class ThreadSemaforo implements Runnable{
    private CorSemafaro cor;
    private boolean parar;
    private boolean corMudou;
 
    public ThreadSemaforo() {
        this.cor = CorSemafaro.VERMELHO;//inicia com vermelho
        this.parar = false;
        this.corMudou = false;
        new Thread(this).start();//executa o metodo run
    }

    @Override
    public void run() {
        while(!parar){
            try{
                /*
                switch (this.cor){
                    case VERMELHO: Thread.sleep(2000);break;
                    case AMARELO: Thread.sleep(300);break;
                    case VERDE: Thread.sleep(1000);break;
                    default:
                        break;
                */
                Thread.sleep(this.cor.getTempoEspera());//opcional
                this.mudarCor();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
    private synchronized void mudarCor(){
        switch (this.cor){
            case VERMELHO:
                this.cor = CorSemafaro.VERDE; break;
            case AMARELO: this.cor = CorSemafaro.VERMELHO; break;
            case VERDE: this.cor = CorSemafaro.AMARELO; break;
         
            default:
                break;
        }
        this.corMudou = true;
        notify();//notifica a thread estiver esperando
    }
 
    public synchronized void esperaCorMudar(){
        while(!this.corMudou){
            try{
                wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
        this.corMudou = false;
    }
 
    public synchronized void deligarSemafaro(){
        this.parar = true;
    }
 
    public CorSemafaro getCor() {
        return cor;
    }

    public boolean isParar() {
        return parar;
    }
 
}

Classe principal

public class Aplicacao1 {
    public static void main(String[] args) {
        ThreadSemaforo semafaro = new ThreadSemaforo();
     
        for(int i= 0; i< 10; i++){
            System.out.println(semafaro.getCor());
            semafaro.esperaCorMudar();
        }
    }
}

12/07/2019

Deadlock usando Thread com Java

Crie um semáforo (sinal de trânsito) usando Threads. O semáforo deve ficar verde por x segundos, depois brevemente amarelo seguido de y segundos na cor vermelha.

Resolução:

Classe ThreadSemafaro

import com.sun.swing.internal.plaf.synth.resources.synth;
public class ThreadSemafaro implements Runnable {

private CorSemafaro cor;
private boolean parar;
private boolean corMudou;

public ThreadSemafaro(){
this.cor = CorSemafaro.VERMELHO;//iniciando com a cor vermelha

this.parar = false;
this.corMudou = false;

new Thread(this).start();
}

@Override
public void run() {

while(!parar){
try {
/*switch (this.cor) {
case VERMELHO:
Thread.sleep(2000);
break;
case AMARELO:
Thread.sleep(300);
break;
case VERDE:
Thread.sleep(1000);
break;
default:
break;
}*/
Thread.sleep(this.cor.getTempoEspera());
this.mudarCor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

private synchronized void mudarCor(){
switch (this.cor) {
case VERMELHO:
this.cor = CorSemafaro.VERDE;
break;
case AMARELO:
this.cor = CorSemafaro.VERMELHO;
break;
case VERDE:
this.cor = CorSemafaro.AMARELO;
break;
default:
break;
}
this.corMudou = true;
notify();
}

public synchronized void esperaCorMudar(){
while(!this.corMudou){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.corMudou = false;
}

public synchronized void desligarSemafaro(){
this.parar = true;
}

public CorSemafaro getCor() {
return cor;
}
}

Enun CorSemaforo

public enum CorSemafaro {
    VERDE(1000), AMARELO(300), VERMELHO(2000);
 
    private int tempoEspera;
    CorSemafaro(int tempoEspera){
        this.tempoEspera = tempoEspera;
    }
    public int getTempoEspera(){
        return tempoEspera;
    }
}

Método principal

public class Principal1 {

    public static void main(String[] args) {
ThreadSemafaro semafaro = new ThreadSemafaro();

for (int i=0; i<10; i++){
            System.out.println(semafaro.getCor());
            semafaro.esperaCorMudar();
           }
semafaro.desligarSemafaro();
    }
}

29/03/2019

Nota aluno em JAVA

Faça um algoritmo em JAVA e implemente os seguintes características:
Matrícula
Nome
Nota1, Nota2, Nota3, Nota4,
mediaSemestral
notaPF
mediaFinal

O algoritmo deve ter uma classe
- o método construtor padrão
- método construtor sobrecarregado
- métodos gets e sets para os atributo
- método para calcularMediaSemestral
- método calcularMediaComPF
Desenvolver uma classe com método main que instancie um objeto da classe e realize operações com esse objeto e as notas do aluno devem ser valores entre 0 < notas < 10:

Resolução:

ClasseNotaAluno1

package notaaluno1;
import java.util.Scanner;

public class ClasseNotaAluno1 {
    Scanner leia = new Scanner(System.in);
    
    private String nome;
    private int matricula;
    private float n1, n2, n3, n4;
    private float mediaFinal, notaPF;
        
    public void Aluno(String nome, int matricula){
        System.out.println("Metodo Aluno: String nome; int matricula");
        this.nome = nome;
        this.matricula = matricula;
    }
    public float mediaSemestral(){
        mediaFinal = (n1 + n2 + n3 + n4) /4;
        System.out.print("\nMÉDIA SEMESTRAL = "+mediaFinal);
        if(mediaFinal >= 6){
            System.out.println(" Aprovado(a)");
        }else if(mediaFinal > 1 && mediaFinal < 6){
            System.out.println("  Aluno(a) de recuperação !");
            calcMediaComPF();
        }else{
            System.out.println("  Reprovado(a)");
        }
        
        return mediaFinal;
    }
    public float calcMediaComPF(){
        System.out.print("\nDigite a nota da PF: ");
        notaPF = leia.nextFloat();
        if(notaPF < 0 || notaPF > 10){
            while(notaPF < 0 || notaPF > 10){
                System.out.println("Erro ! DIGITE UMA NOTA VÁLIDA ENTRE 0 E 10");
                notaPF = leia.nextFloat();
            }
        }
        
        float notaFinal = (notaPF + mediaFinal)/2;
        if(notaFinal >= 5){
            System.out.println("Média finaL = "+notaFinal+" Aprovado(a)");
        }else{
            System.out.println("Aluno(a) "+nome+" nota final = "+notaFinal+" reprovado(a)");
        }
        return notaFinal;
    }
    public void status(){
        System.out.println("\n______Status do aluno(a)_______");
        System.out.print("Aluno(a): "+nome);
        System.out.print("\nNota1 = "+n1+"\nNota2 = "+n2+
                "\nNota3 = "+n3+"\nNota4 = "+n4);
    }
    
    public void setNome(String nome){
        this.nome = nome;
    }
    public void setN1(float n1){
        this.n1 = n1;
    }
    public void setN2(float n2){
        this.n2 = n2;
    }
    public void setN3(float n3){
        this.n3 = n3;
    }
    public void setN4(float n4){
        this.n4 = n4;
    }
    public void setMediaFinal(float mediaFinal){
        this.mediaFinal = mediaFinal;
    }
    public void setNotaPF(float notaPF){
        this.notaPF = notaPF;
    }
        
    public String getNome(){
        return nome;
    }
    public float getN1(){
        return n1;
    }
    public float getN2(){
        return n2;
    }
    public float getN3(){
        return n3;
    }
    public float getN4(){
        return n4;
    }
    public float getMediaFinal(){
        return mediaFinal;
    }
    public float getNotaPF(){
        return notaPF;
    }
    
}

Método Main

package notaaluno1;
import java.util.Scanner;

public class NotaAluno1 {

    static float nota(float notax) {
        Scanner leia = new Scanner(System.in);

        while (notax < 0 || notax > 10) {
            System.out.print("EROO ! Digite uma nota entre 0 e 10: ");
            notax = (leia.nextFloat());
        }
        return notax;
    }

    public static void main(String[] args) {
        Scanner leia = new Scanner(System.in);
        
        ClasseNotaAluno1 aluno = new ClasseNotaAluno1();

        System.out.print("Digite o nome do aluno: ");
        aluno.setNome(leia.next());
        
        System.out.print("Digite a [1°] nota do aluno(a): " + aluno.getNome() + " = ");
        float nota1 = nota(leia.nextFloat());
        aluno.setN1(nota1);
        /*ou
        aluno.setN1(nota(leia.nextFloat()));*/
        
        System.out.print("Digite a [2°] nota do aluno(a): " + aluno.getNome() + " = ");
        float nota2 = nota(leia.nextFloat());
        aluno.setN2(nota2);
        
        System.out.print("Digite a [3°] nota do aluno(a): " + aluno.getNome() + " = ");
        float nota3 = nota(leia.nextFloat());
        aluno.setN3(nota3);

        System.out.print("Digite a [4°] nota do aluno(a): " + aluno.getNome() + " = ");
        float nota4 = nota(leia.nextFloat());
        aluno.setN4(nota4);


        aluno.status();
        aluno.mediaSemestral();
        
        
        System.out.println("\n");
    }
}

26/01/2019

Matriz com números aleatórios em Java


/*Faça um algoritmo de uma matriz 4x4 com valores aleatórios entre 0 e 100. Apos isso determine o maior número da matriz e a sua posição.*/

import java.util.Random;

public class Main{
public static void main(String[] args){
    int[][] numAleatorio = new int [4][4];
    Random numeroRandom = new Random();
 
    for (int i = 0; i < numAleatorio.length; i++){
        for (int j = 0; j < numAleatorio[i].length; j++){
            numAleatorio[i][j] = numeroRandom.nextInt(100);//gera numero aleatorio de 0 a 100
        }
    }
 
    //int maior = Integer.MIN_VALUE;
int maior = 0, linha = 0, col = 0;

for (int i = 0; i < numAleatorio.length; i++){
    for (int j = 0; j < numAleatorio[i].length; j++){
        if(numAleatorio[i][j] > maior){
            maior = numAleatorio[i][j];
            linha = i;
            col = j;
        }
    }
}

System.out.print("\t\tMatriz\n");
for (int i = 0; i < numAleatorio.length; i++){
    for (int j = 0; j < numAleatorio[i].length; j++){
        System.out.print("\t"+numAleatorio[i][j]+" ");
    }
    System.out.println();
}
System.out.println("\nMaior valor = "+maior);
System.out.println("Linha: "+linha);
System.out.println("Coluna:"+col);
}
}