SSブログ

SELECTのPulldownメニュー右詰表示 [Webシステム]


 SELECTで数値を選択にすると左詰め表示になり、桁数が異なる場合は非常に見づらくなる。 そこで、単純にstyle="text-align: right"で指定してやれば右詰になるだろうとやってみるも、右詰にはならない。netでしらべるとCSSではムリみたい。そこで強引にスペースを左側にスペースを入れて桁をあわせ、monospace文字表示することで実現してみた。

実際のサンプル

通常の表示


右詰の表示



Web上でExcel風 フィルターの作成 [Webシステム]


 Web上でDBからデータを抽出して表にして表示する場合、Excelのように項目毎にフィルターをかけ表示項目を絞込みたい場合がある。フィルター項目が少ない場合、SELECT文のWHEREをif文で分岐して書くことが可能であるが、項目が多くなると見通しが悪いif文のお化けとなる。
 そこで、各項目に2進数の重み付けを行い、switch case文で条件を分岐してSELECT文を書いてみた。

コード説明(PHP,SQLite)
//項目に2進数で重み付け(非選択時は0)
$項目1_d = 0;$項目2_d = 0;$項目3_d = 0;
$項目1 = $_POST['項目1']; if(!empty($項目1)) $項目1_d = 1; 
$項目2 = $_POST['項目2']; if(!empty($項目2)) $項目2_d = 2;
$項目3 = $_POST['項目3']; if(!empty($項目3)) $項目3_d= 4;
       ・
       ・
$sel_num = $項目1_d + $項目2_d + $項目3_d + ・・・; 

//どの項目が選択状態かをチェックしてWHERE条件式を作成
switch($sel_num){    
  case 0: $sql_2=""; break;
  case 1: $sql_2=" WHERE 項目1='".$項目1."'"; break; //項目1が選択状態
  case 2: $sql_2=" WHERE 項目2='".$項目2."'"; break; //項目2が選択状態
  case 3: $sql_2=" WHERE 項目1='".$項目1."' AND 項目2='".$項目2."'"; break;  //項目1,2が選択状態
  case 4: $sql_2=" WHERE 項目3='".$項目3."'"; break;                                       //項目3が選択状態
   ・
   ・
}
$sql_1 = "SELECT * FROM table_name ";
$sql = $sql_1.$sql_2;
$result = $link->query($sql);
while($row = $result->fetchArray()){
	表示処理
}

Excelで郵便番号から住所変換(WEBSERVICE,Addin,WEBAPI) [VBA/VBS]


 Excel表で郵便番号を入力すると自走で住所が入ると便利なことがある。そこでExcel 2013で追加された「WEBSERVICE」関数、zipcode7.xlaアドイン、普通にWebAPIでXMLデータを取得する方法の3種類作成してみた。

「WEBSERVICE」関数を使用する方法
 こちらの「郵便番号検索API」サービスを使用させてもらい、住所のセルに=FILTERXML(WEBSERVICE("http://zip.cgis.biz/xml/zip.php?zn=" & 郵便番号cell),"/ZIP_result/ADDRESS_value/value[@address]/@address")とすれば簡単に実現できる。
 しかし複数行に渡って入力するには上記の式をコピーになければいけなくスマートではないのでVBAで制御することにした。
サンプル
実際のサンプルはここ
コード
'-------------------------------------------------------------------------------------------
'    Sheet1 マクロ
' セルの値が変化したときA列の郵便番号をB列の住所に変換
'------------------------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Integer
  Dim zipcode, cellad As String
  
  For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
    If Target.Address() = "$A$" + CStr(i) Then
      cellad = "$A$" + CStr(i)
      Cells(i, 2) = zip2address(Range(cellad))
    End If
  Next
End Sub
’------------------------------------------------------------------------------------------------
'   Module1 マクロ
'     FilterXML, WebServiceをWorksheetFunctionを使いvbaで使用
’------------------------------------------------------------------------------------------------
Function zip2address(ByVal 郵便番号 As String)
  Dim httpAdd, State, city, Address As String
  
  郵便番号 = Replace(郵便番号, "-", "")
  httpAdd = "http://zip.cgis.biz/xml/zip.php?zn="
  If 郵便番号 <> "" Then
    State = WorksheetFunction.FilterXML(WorksheetFunction.WebService(httpAdd + 郵便番号), "/ZIP_result/ADDRESS_value/value[@state]/@state")
    city = WorksheetFunction.FilterXML(WorksheetFunction.WebService(httpAdd + 郵便番号), "/ZIP_result/ADDRESS_value/value[@city]/@city")
    Address = WorksheetFunction.FilterXML(WorksheetFunction.WebService(httpAdd + 郵便番号), "/ZIP_result/ADDRESS_value/value[@address]/@address")
  
    zip2address = State + city + Address
 Else
    zip2address = ""
 End If
End Function


Microsoftのzipcode7.xlaアドイン
 インターネットに接続しなくても使えるように、こちらの郵便番号変換アドイン"zipcode7.xla"を使用してみた。本アドインを組み込んで使用する方法は組み込むにも手間がかかること、3ステップもの[郵便番号変換ウィザード ステップ]に入力が必要なのでVBAでzipcode7.xlaのコアな機能のみを使ってみることにした。
 しかしaddin側のfunctionを使用するには、Excelの[セキュリィセンター]-[マクロの設定]-[開発者向けのマクロ設定]-[VBAプロジェクトとオウジェクトモデルへのアクセスを信頼する(Y)]をチェックする必要があることが分かり、この方法も諦め。zipcode7.xlaのコアな機能のみを切り出し、今回作成するExcelのModuleに取り込む方法で実現した。
 取込んだModule(zipcode7.xlaからインポート): Addin_Common, YUBIN7_Core

サンプル
実際のサンプルはここ
コード
'-------------------------------------------------------------------------------------------
'    Sheet1 マクロ
'-------------------------------------------------------------------------------------------
' WEBSERVICEと同じ

’------------------------------------------------------------------------------------------------
'   Module1 マクロ
’------------------------------------------------------------------------------------------------
Public Function zip2address(郵便番号 As String)
    Dim 県 As String * 255, 都市 As String * 255, 都市2 As String * 255
    Dim 町名 As String * 255, 町名2 As String * 255
    Dim Ret As String
    
  If 郵便番号 <> "" Then
    Call YUBIN7_Core.fnStartYubin7
    Call GetZipDecision(郵便番号, 県, 都市, 都市2, 町名, 町名2)
    
    Ret = Replace(県 & 都市 & 都市2 & 町名 & 町名2, Chr(0), vbNullString)
    Ret = Replace(Ret, Chr(32), vbNullString)
    zip2address = Ret
  Else
    zip2address = ""
  End If
End Function

普通にWebAPIでXMLデータを取得する方法
「WEBSERVICE」関数を使用する方法と同じAPIを使用させてもらい、普通にVBAでHTTPリクエストを投げレスポンスを受け取る方法で住所を取得している。
サンプル
実際のサンプルはここ
コード
'-------------------------------------------------------------------------------------------
'    Sheet1 マクロ
'-------------------------------------------------------------------------------------------
' WEBSERVICEと同じ

’------------------------------------------------------------------------------------------------
'   Module1 マクロ
’------------------------------------------------------------------------------------------------
Function zip2address(ByVal 郵便番号 As String)
  Dim objXMLHttp As Object, zipArr, xmldata
  Dim state As String, city As String, address As String

  郵便番号 = Replace(郵便番号, "-", "")
  If 郵便番号 <> "" Then
    Set objXMLHttp = CreateObject("MSXML2.XMLHTTP")
    objXMLHttp.Open "GET", "http://zip.cgis.biz/xml/zip.php?zn=" & 郵便番号, False
    objXMLHttp.Send
    Set xmldata = objXMLHttp.responseXML

    state = xmldata.ChildNodes(1).ChildNodes(9).ChildNodes(4).Attributes.Item(0).Text
    city = xmldata.ChildNodes(1).ChildNodes(9).ChildNodes(5).Attributes.Item(0).Text
    address = xmldata.ChildNodes(1).ChildNodes(9).ChildNodes(6).Attributes.Item(0).Text
    zip2address = state + city + address
  Else
    zip2address = ""
  End If
End Function


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。