2017年11月10日 星期五

ireport使用紀錄

真的超級難拉QAQ
希望以後更熟悉會比較會用
但是他限制真的很多
不過免費的就將就用囉


 「值」簡介
Styles:樣式
Parameter:參數,只有一個的參數適合放這邊,ex:列印者 申請日期等等
Fields:detail裡的欄位值
Variable:一些變數...或是計算出來的值

「區塊」簡介
Title:主題 
Page Header:每一頁的頭
Column Header:每一個detail的頭
Detail :資料(只設計一列,越多資料會自己長長)
Column Footer:每一個detail的尾
Page Footer:每一頁的頁尾
Last Page Footer:只有最後一頁出現的頁尾
Summary:摘要
No Data:沒有detail時出現的
Background:背景(可以加浮水印啥的)

P.S.還可以自己加group,但是還不明白準確的使用方式

「調色板」簡介
只記錄我用過的,排序以我最常用的先

Static Text:固定的字
Text Field:會動的字
Line:直線
Frame:區塊
Rectangle:方框
Barcode:條碼
Subreport:子報表
Page number:本頁頁碼
Total pages:總頁數
Image:圖


報表屬性設定 

Page size > Orientation:
Pottrait:直的(預設)
Landscape:橫的
Margins:邊界大小
More > Title on a new page:title自己占第一頁,若需要封面時可打勾
More > Summary on a new page:Summary自己佔最後一頁,需要的話打勾(注意:若summary不是自己一頁的話,會在column footer上面
More > Summary with Header and Footer:Summary那單獨一夜的時候也要有page Header and Footer,需要的話打勾
More > Float column footer: 若detail未填滿,column footer會直接接著detail,中間無空白(注意:若summary不是自己一頁的話,column footer會連著summary)
More > Ignore pagination:若打勾則不分頁
More > When No Data:當無資料時,預設無頁面,若需顯示No Data區塊則改選No Data Section

區塊屬性設定
Print When Expression:當敘述為true,顯示區塊
Split Type:當內容超過區塊高度,
Immediate:直接顯示不完整內容
Prevent :到新的一頁顯示完整內容
Stretch :延伸顯示當前內容


調色板通用屬性設定
Left、Top:位置設定(相對於所在區塊)
Width、Height:大小
Opaque:是否透明(有勾是透明)
Position Type:
Fix Relative Top:固定於區塊頂部
Float:浮動(!!!超好用)
Fix Relative Bottom:固定於區塊底部
Text Field 屬性設定
Text Fild Expression:除了可以放參數,還可以下條件式~~
Blank When Null:若值為null則顯示空白,沒勾就會顯示n u l l
Stretch With Overflow:若沒勾則超過大小的內容會卡掉
字體設定等照字面翻譯即可

Barcode設定
選Barcode4J > Code 128
Image設定
注意路徑須為絕對路徑
可以用Parameter傳入路徑,方便動態調整
groovy中,路徑可用:
new File(“相對路徑”).getAbsolutePath()  //mac可用,window不可用
Executions.getCurrent().getDesktop().getWebApp().getRealPath("/")+"相對路徑"

           
 若有好多欄位會放在同一個橫排的感覺,可以用frame包起來,若有須自動延伸的欄位看起來也會比較整齊,向下延伸,下方整個也會向下
  

 若想在detail與summery中間放東西,可新增一個group,就會多一個 xx Group Header 和xx Group Footer,東西放在xx Group  Footer就會連著detail而且在summary上面~
為神魔要這樣呢?因為Column  Footer如果放動態資料超過一頁的話會錯誤,所以只能放在summary 

以上為我自己的理解,
此網頁為更明確的介紹



2017年2月19日 星期日

Android-使用webService

因為專題要使用ASP.NET Web service
然後介面要有網頁單機跟APP
因為APP實在是太不熟悉惹
所以趕快來做個紀錄



這個完完全全只是練習連接的部分
所以包括web service的設計都只有兩種
一種是沒有傳值過去
一種是有傳值


一開始是新增專案...
好哦完全沒有難度
就這樣
然後我沒有選7.0的系統
因為聽說好像不是很好用





第一步呢
先下載一個叫做"Ksoap2"的東西
放到你專案的資料夾裡

然後回到你的專案
看到他了沒
看到之後就右鍵
選倒數第二個"Add as Library"




























然後問你要加到哪
我沒試過其他的有興趣可以試試

然後我的介面...

















我希望一打開會跑測試1
按完按鈕會跑測試2

然後程式來了
我習慣在開一個檔案放非主程式的部分啦
看你們喜歡














好了~一個空白的檔案
乾乾淨淨


[webConect.java]

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class webConect {
    /** 宣告連接 Web Service的基本資料*/
    private static final String NAMESPACE = "http://120.125.76.185/ECG_Webservice/" ;
    private static final String URL = " http://120.125.76.185/ECG/ECG_webservice.asmx";

    public String text1(){
/** 將EditText中的值傳給 Web Service*/
        SoapObject request = new SoapObject(NAMESPACE,"text1");
/** 設定呼叫 Web Service一些值*/
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.bodyOut=request;//envelope.setOutputSoapObject(request);//擇一使用
        HttpTransportSE androidHttpTransport = new HttpTransportSE( URL);
        androidHttpTransport.debug = true; // 測試模式使用
        try
        {
/** 開始呼叫 Web Service*/
            androidHttpTransport.call(NAMESPACE+"text1", envelope);
            // 获取返回的数据
            SoapObject object = (SoapObject) envelope.bodyIn;
            // 获取返回的结果
            String result = object.getProperty(0).toString();
            return result;
        }
        catch(Exception e) {
            return e.toString();
        }
    }
    public String text2(String SS){
/** 將值傳給 Web Service*/
        SoapObject request = new SoapObject(NAMESPACE,"text2");
        request.addProperty("s",SS);
/** 設定呼叫 Web Service一些值*/
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.bodyOut=request;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE( URL);
        androidHttpTransport.debug = true; // 測試模式使用
        try
        {
/** 開始呼叫 Web Service*/
            androidHttpTransport.call(NAMESPACE+"text2", envelope);
            // 获取返回的数据
            SoapObject object = (SoapObject) envelope.bodyIn;
            // 获取返回的结果
            String result = object.getProperty(0).toString();
            // 将WebService返回的结果显示在TextView中
            return result;
        }
        catch(Exception e) {
            //e.printStackTrace();
            return e.toString();
        }
    }
}



主要連接就這樣喔
再來就是超級討厭害我找很久不知道哪裡錯的地方了
第一個是權限問題
這個檔案打開來














然後加上一行
<uses-permission android:name="android.permission.INTERNET" />

位子在這邊
這個就過關了

然後還有一個
執行緒的問題
主頁程式裡面使用webConect
要用Thread來跑
不然不能用
Thread thread = new Thread(){
        public void run(){
            txt1.setText(wc.text1());
        }
    };

要執行的地方就加上thread.start();



基本上先到這邊好了
不過還有些小問題還沒解決
就之後找到了再補上囉

2017年1月31日 星期二

迷你備忘錄練習-Android

Android設計真的是說難好像也還好
說簡單好像又不是那麼簡單

這個小範例包括:
1. ListView選項動態控制
2. 跨頁面傳值
主要是這兩個
至於監聽我在C#好像很少用到這個概念?(還是其實有哈哈哈學藝不精)
反正也是做個小小記錄
因為前面練習監聽設計的範例有點簡單哈哈哈(單純不想打開專案)

然後這個範例
不 能 存 檔 !!!
而且只有六格
所以基本上關掉備忘錄就不見拉
沒有實際用途



開始先拉畫面嚕沒什麼難度


介紹一下
Android的畫面是XML寫的
activity_main.xml就是畫面排版阿樣式設計阿放的地方
MainActivity,java是主程式的檔案
string.xml是放一些activity_main.xml會用到的文字或陣列
像是標題 "迷你備忘錄" 就是放在那裏
檔案大概的位置這樣



















重點一來拉~
我要來做ListView選項動態控制

我的ListView的id是LV_tatle //這個是在activity_main.xml設定
然後程式的部分 //被馬掉的部分代表還沒介紹到先打的

來喔文字檔一一介紹:(綠字是自己要打的,黃字是打完會產生的,紅字是講解)
public class MainActivity extends AppCompatActivity
implements AdapterView.OnItemClickListener,AdapterView.OnItemLongClickListener//你需要用到的監聽
{
    ListView LV; //新增一個物件
    String[] item; //我需要的項目字串陣列
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //
        LV=(ListView)findViewById(R.id.LV_tatle);//就...找到那個id...反正就那樣//這常用喔
        LV.setOnItemClickListener(this);//監聽按一下項目事件
        LV.setOnItemLongClickListener(this);//監聽長按項目事件
        item=new String[]{"1.","2.","3.","4.","5.","6."};//設定項目字串
        LV.setAdapter(new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,item));//用ArrayAdapter<String>來把陣列設定進ListView的項目裡
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //按一下項目要做的事
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        return false;
        //長按項目要做的事
    }
}

好了
來整理一下
使用ListView可以用些什麼(只說程式要寫什麼,樣式不管我不會)
1. 先新增一個ListView物件,指向你介面的那個ListView
    ListView LV=(ListView)findViewById(R.id.LV_tatle);
2. 需要做監聽
    (1)implements AdapterView.OnItemClickListener,AdapterView.OnItemLongClickListener
    (2)LV.setOnItemClickListener(this);//監聽按一下項目事件
         LV.setOnItemLongClickListener(this);//監聽長按項目事件
3. 動態設定項目
    (1)要有一個陣列
    (2)要有一個ArrayAdapter<???(資料型別)> ArrayAdapter_=
     new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,你的陣列名稱)
    (3) LV.setAdapter(ArrayAdapter_);

好啦不難吧


再來做跨頁面傳值
先要新增一個頁面
就是按一下ListView的選項會跳到的編輯頁面






















然後就取名字
看心情高興改就改吧反正我是沒改





















再來介紹程式碼的部分:
先說簡單版的
就是第一頁有傳值給第二頁
可是第二頁沒有要回傳給第一頁的時候
在MainActivity,java//第一頁的程式
Intent It=new Intent(this, Main2Activity.class);
It.putExtra("item",1); //要傳的值是1的話,不一定要數字,字串也可
startActivity(It); //打開第二頁
在Main2Activity,java//第二頁的程式
 Intent It=getIntent(); //把自己打開(應該...吧
 note=It.getStringExtra("item"); //取得傳過來的值
finish(); //結束第二頁,回第一頁


這次要用的是要回傳的
反正就是會有多一個識別碼
然後多一個事件
至於識別碼跟事件的關聯還沒研究
之後了解了再做更新

在MainActivity,java//第一頁的程式
        It.putExtra("note",item[position]);
        startActivityForResult(It,position);//startActivity(It); 原本是這個,換一個加上識別碼的

    protected void onActivityResult(int requestCode,int resultCode,Intent it){
        if(resultCode==RESULT_OK){//如果回傳OK的話
            item[requestCode]=it.getStringExtra("note");
            AA.notifyDataSetChanged();//LV的Array更新陣列
        }
    }

在Main2Activity,java//第二頁的程式
        Intent It=getIntent(); //一樣打開自己
        note=It.getStringExtra("note");//取得傳來的值
        Intent it2=new Intent(); //要傳回去噠
        it2.putExtra("note",txv_id.getText()+" "+ET_note.getText()); //要傳回去的值
        setResult(RESULT_OK,it2); //如果確定要傳回去了,附加一個OK

        setResult(RESULT_CANCELED);//如果沒有值要回傳
        finish();


全部全部程式碼來嚕~
先上圖



















程式 文字檔:
MainActivity.java

package com.example.aa206.a0201_1;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity
implements AdapterView.OnItemClickListener,AdapterView.OnItemLongClickListener{
    ListView LV;
    Intent It;
    ArrayAdapter<String> AA;
    String[] item;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //
        It=new Intent(this, Main2Activity.class);
        LV=(ListView)findViewById(R.id.LV_menu);
        LV.setOnItemClickListener(this);
        LV.setOnItemLongClickListener(this);
        item=new String[]{"1.","2.","3.","4.","5.","6."};
        AA=new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,item);
        LV.setAdapter(AA);
    }
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        It.putExtra("note",item[position]);
        startActivityForResult(It,position);
    }
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        item[position]=position+".";
        AA.notifyDataSetChanged();
        return false;
    }
    protected void onActivityResult(int requestCode,int resultCode,Intent it){
        if(resultCode==RESULT_OK){
            item[requestCode]=it.getStringExtra("note");
            AA.notifyDataSetChanged();
        }
    }
}

Main2Activity.java


package com.example.aa206.a0201_1;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class Main2Activity extends AppCompatActivity {
    TextView txv_id;
    EditText ET_note;
    int id;
    String note;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //
        txv_id=(TextView)findViewById(R.id.txv_id);
        ET_note=(EditText)findViewById(R.id.eT_note);
        //
        Intent It=getIntent();
        note=It.getStringExtra("note");
        //
        txv_id.setText(note.substring(0,2));
        if(note.length()>3)
            ET_note.setText(note.substring(3));
    }
    public void onSave(View v){
        Intent it2=new Intent();
        it2.putExtra("note",txv_id.getText()+" "+ET_note.getText());
        setResult(RESULT_OK,it2);
        finish();
    }
    public void onCancel(View v){
        setResult(RESULT_CANCELED);
        finish();
    }

}