2017/01/31

FTPで送られてくるXMLファイルをSQLServerに自動的にロードする

  • Goal

    FTPで送られてくるXMLファイルを自動的にSQLServerのテーブルにロードする。
    SQLServer上にテーブル名Logxmlを作成し、受信したXMLを1カラムにINSERTする。LogxmlテーブルのSQLは以下の通り。この後、必要に応じてXML形式のカラムからトリガーやTSQLなどで各要素・カラムの切り出しをする。

    CREATE TABLE [dbo].[Logxml](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [logxml] [xml] NULL,
    [filename] [varchar](500) NULL,
    [creation_date] [datetime] NULL,
    CONSTRAINT [PK_Logxml] PRIMARY KEY CLUSTERED
    (
    [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO


  • How

    PowerShellで実施。
    ターゲットのフォルダから対象のファイル名を取得して、Bulkインサートを行う。
    スクリプトは常駐させておいて、60秒間隔で起動。
    (本当はWMIでやりたいので、後日トライ予定)

    #一定時間間隔で起動
    while(1){
    #終了時は、[Ctrl + C] を押す
    Write-Host "End to [Ctrl + C]"
    #Connect to the SQL database
    $SQLserver = "0.0.0.0" -- SQL server name
    $Icatalog = "TEST" -- Database name
    $UID = "UID"
    $PASSWORD = "PASSWORD"
    $conn = New-Object System.Data.SqlClient.SqlConnection
    $conn.ConnectionString = "Server = $SQLserver; Database = $Icatalog; User ID = $UID; Password= $PASSWORD;"
    $Conn.Open()
    $Command = New-Object System.Data.SQLClient.SQLCommand
    $Command.Connection = $Conn
    #FTPで受信するフォルダPathの設定
    $filepath = "C:\inetpub\ftproot\test"
    #フォルダ内の全てのXMLファイルをリスト化
    $filelist = Get-ChildItem -name $filepath\*.xml
    #リストの上から順番にLoad
    foreach ($filename in $filelist){
    $fileinput = Get-Content $filepath\$filename
    echo "Loading $filename"
    $output | foreach {
    $Command.CommandText = "INSERT INTO dbo.Logxml(logxml,filename,creation_date) SELECT CONVERT(XML, BulkColumn) AS BulkColumn,'$filename',getdate() FROM OPENROWSET(BULK '$filepath\$filename', SINGLE_BLOB) AS X"
    $Command.ExecuteNonQuery() | out-null
    }
    #アーカイブフォルダーへファイルの移動
    Move-Item $filepath\$filename $filepath\archive
    }
    $Conn.Close()
    #60秒待機
    Start-Sleep -Seconds 60
    }

2017/01/30

特定の文字の間の文字を切り出す - SQL


  • Goal
    文字列から特定の文字の間の文字を抜き出す
    (例)  1234567890123 Hello 0980 982134 1adfllkjasf から1つ目の空白と
       2つ目の空白の間の文字列を抜き出す。
       結果として、Helloだけを抜き出す。
  • Source

    INPUT 1st_BLANK 2nd_BLANK START_POSITION LENGTH GOAL
    1234567890123 Hello 0980 982134 1adfllkjasf 14 20 15 5 Hello
    1234567890123456 World!! 0980 982134 1adfllkjasf 17 25 18 7 World!!
    view raw Result.txt hosted with ❤ by GitHub
    SELECT INPUT
    --CHARINDEX(検索文字列,検索対象文字列,<OPTION>開始位置)
    , CHARINDEX(' ',INPUT) AS '1st_BLANK' --1st blank position
    , CHARINDEX(' ',INPUT,CHARINDEX(' ',INPUT)+1) AS '2nd_BLANK' --2nd blank position
    , CHARINDEX(' ',INPUT)+1 AS START_POSITION
    , CHARINDEX(' ',INPUT,CHARINDEX(' ',INPUT)+1) - (CHARINDEX(' ',INPUT)+1) as LENGTH -- 2nd blank - start position
    --SUBSTRING(文字列,開始位置,長さ)
    , SUBSTRING(INPUT,CHARINDEX(' ',INPUT)+1,CHARINDEX(' ',INPUT,CHARINDEX(' ',INPUT)+1) - (CHARINDEX(' ',INPUT)+1)) as GOAL
    FROM (VALUES('1234567890123 Hello 0980 982134 1adfllkjasf')
    ,('1234567890123456 World!! 0980 982134 1adfllkjasf')) as T(INPUT)

2017/01/28

BOM構成表情報を取得するAPI

  • Goal
    BOMPEXPL.EXPLODER_USEREXITを呼び出して、BOM_EXPLOSION_TEMPテーブルに出力させる。APEXのアプリから、EBSのBOM構成表を呼び出したりできる。
    INTENDED BILLの画面と同じ情報を引っ張ってこれる。

  • Sourceサンプル
    DECLARE
    l_err_msg VARCHAR2(4000);
    l_error_code VARCHAR2(4000);
    l_grp_id NUMBER;
    l_session_id NUMBER;
    l_count NUMBER;
    l_item_id NUMBER;
    --
    BEGIN
    SELECT USERENV ( 'sessionid') INTO l_session_id FROM DUAL;
    dbms_output.put_line ('l_session_id is - '||l_session_id );
    bompexpl.exploder_userexit (
    verify_flag => 0,
    org_id => XXX, -- Organization_ID
    order_by => 1,
    grp_id => 999999, -- 999999をセットして動かしている
    session_id => '', -- blank でも動く
    levels_to_explode => 10,
    bom_or_eng => 1, --1=BOM 2=ENG
    impl_flag => 1, --1=Implemented Only 2=Implemented and Unimplemented
    plan_factor_flag => 2, --1=yes 2=No
    explode_option => 2, --1=ALL 2=Current 3=Current and Future
    module => 1, --1=Costing 2=BOM 3=Order Entry 4=ATP 5=WSM
    cst_type_id => 1,
    std_comp_flag => 2,
    expl_qty => 5,
    item_id => l_item_id,
    alt_desg =>'',
    comp_code => '',
    rev_date => TO_CHAR ( SYSDATE, 'YYYY/MM/DD HH24:MI:SS'),
    err_msg => l_err_msg ,
    error_code => l_error_code);
    dbms_output.put_line ('l_err_msg is '||l_err_msg );
    dbms_output.put_line ('l_error_code is '||l_error_code );
    EXCEPTION
    WHEN OTHERS
    THEN
    RAISE_APPLICATION_ERROR(-20001, SQLERRM);
    --
    commit;
    END;
    /

2017/01/27

オラクル スケジューラー テンプレ

  • Goal
    DBMS_SCHEDULERパッケージを使って、PL/SQLブロックや、プロシージャのスケジュールを作る。Oracle Schedulerを使う。

  • Sourceサンプル
    Sample1 - PLSQLブロックを5時57分から23時57分まで、毎時間流す
    Sample2 - プロシージャを2時間おきに
    流す

    ---- Sample1
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
    job_name => '"XXX"."YYYYYYY"', -- JOB の名前
    job_type => 'PLSQL_BLOCK',
    job_action => 'BEGIN
    --dbms_mview.refresh(''------'',''c'', NULL, TRUE, FALSE, 1, 0, 0, FALSE, FALSE);
    END;',
    number_of_arguments => 0,
    start_date => TO_TIMESTAMP_TZ('2017-01-25 00:00:00.000000000 AMERICA/CHICAGO','YYYY-MM-DD HH24:MI:SS.FF TZR'),
    -- 5時57分から23時57分まで、毎時間流す
    repeat_interval => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI,SAT;BYHOUR=5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23;BYMINUTE=;BYSECOND=0',
    end_date => NULL,
    enabled => FALSE,
    auto_drop => FALSE,
    comments => 'Refresh ----- every 1 hour');
    DBMS_SCHEDULER.SET_ATTRIBUTE(
    name => '"XXX"."YYYYYYY"', -- JOB の名前
    attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF);
    DBMS_SCHEDULER.enable(
    name => '"XXX"."YYYYYYY"'); -- JOB の名前
    END;
    ---- Sample2
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
    job_name => '"XXX"."YYYYYYY"', -- JOB の名前
    job_type => 'STORED_PROCEDURE',
    job_action => 'XXXX.ZZZ_MAIN_PKG.XXX',--- Procudere名
    number_of_arguments => 0,
    start_date => NULL,
    -- 6時から20時まで2時間おきに流す
    repeat_interval => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI,SAT;BYHOUR=6,8,10,12,14,16,18,20;',
    end_date => NULL,
    enabled => FALSE,
    auto_drop => FALSE,
    comments => 'test');
    DBMS_SCHEDULER.SET_ATTRIBUTE(
    name => '"XXX"."YYYYYYY"', -- JOB の名前
    attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF);
    DBMS_SCHEDULER.enable(
    name => '"XXX"."YYYYYYY"');
    END;
  • 参考 Thanks!!
    Oracle Scheduler マニュアル

2017/01/17

日付から年と週番号を求める - ISO方式 / VB6の場合

  • Goal
    日付からISO8601方式での年+週番号(YY-WWのフォーマット)で出力する。
    ISO8601では、月曜日が週の始まりで、最初の木曜日を含む週が、その年の第1週として計算する。 

  • Sourceサンプル
    手順: 1. ターゲットの日付を含む週の月曜日を求めて、年を算出する
        2. ISO方式を考慮した週番号を算出する。
    想定結果(YY-WW): 2017/01/01(SUN) = 16-52
                                     2018/01/01(MON) = 18-01
                                     2019/01/01(TUE) = 19-01
                                     2020/01/01(WED) = 20-01
                                     2021/01/01(FRI) = 20-53
                                     2022/01/01(SAT) = 21-52
                                     2023/01/01(SUN) = 22-52

    Private Sub Command1_Click()
    Dim A As String
    Dim TEST_D As Date
    TEST_D = #1/1/2018#
    A = Format(TEST_D - (Weekday(TEST_D, vbMonday) - 1), "yy")
    & "-"
    & Format((DatePart("ww", TEST_D, vbMonday, vbFirstFourDays)), "00")
    Print A
    End Sub


  • 参考 Thanks!!
    DatePart function - Microsoft Developer Network
    年月日から週番号 : 計算結果の確認用




     

2017/01/15

Monopoly DEAL モノポリー DEAL ー カードゲーム

最近、よくやるやつ。モノポリーほど時間がかからなくて、お金のやり取りとかがめんどくさくないカードゲーム版のモノポリー。全くルールは違っていて、交渉も必要ない。
ギリギリまで大逆転も可能で結構よくできていると思う。Deal Breaker とJust say no が、大富豪のジョーカーとスペード3返しみたいな感じで使えるのが私は好き。(よくわからん説明。。。。)

子供10才は可能。6才はまだ無理。我が家では、モノポリーよりは険悪にならずにプレイできる。

モノポリー ディール - Monopoly Deal

2017/01/12

.bash コマンドインデックス

.bash のコマンド集

1. which bash - bash の種類を確認
   #/bin/bash
   #この結果をスクリプトの一行目に表示す
   #!/bin/bash
2. cd - フォルダの変更
3. ls - フォルダの中身を表示
4. rm - ファイル、フォルダの削除
5. cp - ファイルのコピー
6. mv - ファイルの移動
7. mkdir - ディレクトリを作成
8. pwd - 現在のフォルダパスを表示
9. chmod - ファイル・ディレクトリのアクセス権限変更
10. tee - 標準出力+ファイル出力の同時出力
11. awk - 文字列コントロール/編集
12. xargs - 
標準入力から生成したコマンドラインを実行する

タスクマネージャをリモートデスクトップ上で起動

- Issue
  リモートデスクトップ接続中Ctrl+Alt+Deleteでタスクマネージャを起動できない。

 (知らずにしょーもない時間を潰す…)

- 対策
  1. Ctrl+Shift+Esc
  2. Run taskmgr
     Windows key + R -> taskmgr
  3. タクスバー上で右クリックする



- Thanks!
  
  How-to Geek - Six ways to open the windows task manager  

2017/01/05

SQL server ログファイルが大きくなる

- Issue
  SQL Serverのログファイルが大きくなる。特に、洗い替えの処理等を頻繁に行うような場合。




- 原因と対策
 Recovery modelの設定が原因。 Fullになっている。
 それをSimpleに変更する。
 (注)洗い替え処理なので、ロールバックが重要ではないので。。。


--参考
--https://technet.microsoft.com/en-us/library/ms189493(v=sql.105).aspx
--
USE <database-name>;
GO
-- DBの設定を、SIMPLEモードにする
ALTER DATABASE <database-name> SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (<log-file-name>, 1);
GO
-- 設定をもどす。洗い替えならSIMPLEのままでよい
ALTER DATABASE <database-name> SET RECOVERY FULL;
GO
view raw Shrink_LOG.sql hosted with ❤ by GitHub