Thursday, November 25, 2010

Workflow là gì?

Định nghĩa đơn giản nhất của workflow: là các định nghĩa của các qui trình đã chuẩn hóa. Và khi mình viết các module cho từng công việc, workflow là 1 chuỗi công việc phải làm. Thường thì các công ty nước ngoài hoặc các doanh nghiệp lớn mới có được sự ổn định trong các quy trình làm việc, nên workflow của họ thường là 1 dòng chảy thống nhất, ví dụ: A –> B –> C –> D. Tuy nhiên ở các doanh nghiệp Việt Nam, sự ổn định trong dòng chảy đó thường là hiếm, nên nhiều khi các ERP có workflow phải thường là workflow động. VD, tại một thời điểm X thì workflow của phòng SX là A –> B –> C –> D, tuy nhiên có thể tại thời điểm Y thì workflow đó được thay đổi là: B –> A –> C –> D, và … Tuy nhiên để rộng đường tìm hiểu workflow, tôi xin mượn ý kiến của 1 bài viết mà tôi đã có dịp đọc được trên mạng (hình như là của PAT). Theo bài viết đó thì workflow trong một ERP thể hiện ở các yếu tố căn bản sau :

1. Các quy trình và khả năng xử lý công việc theo trình tự công việc. Ví dụ trình tự công việc cho việc mua hàng trong hệ thống ERP minh hoạ như sau : Các bộ phận có nhu cầu mua hàng xây dựng yêu cầu mua hàng POP (Purchase order Proposal) -> phòng mua hàng -> Nhân viên phụ trách mua ứng với từng loại hình xem xét -> Đề nghị mua hàng của bộ phận mua hàng -> phê duyệt của lãnh đạo phòng -> đề nghị báo giá hoặc đấu thầu -> đánh giá nhà cung cấp -> lựa chọn NCC-> lập đơn hàng chính thức PO -> nhận khẳng định cung ứng từ NCC -> theo dõi nhận hàng -> nhận hóa đơn từ NCC -> chuyển hoá đơn đến kế toán thanh toán….

2. Khả năng xem xét trình tự công việc và phê duyệt công việc trên hệ thống . Lúc này việc hoạch định phân quyền cho từng bước xử lý công việc của mỗi một quy trình phải nghiêm ngặt để đảm bảo tính đúng đắn của thông tin và truy cứu trách nhiệm sau này.

3. Giống như ví dụ workflow động mà tôi nêu trên, cái này được thực thi qua hệ thống tham số quy trình nghiệp vụ và khả năng ánh xạ tham số vào thiết lập quy trình nghiệp vụ (mapping). Đây cũng là một chỉ tiêu rất quan trọng để đánh giá khả năng của một ERP. Một vài ví dụ trong hệ thống tham số mà mình đã thiết lập. DN vừa có một Khách hàng mới. Do thời gian ban đầu muốn có những ưu đãi DN có thể quyết định không tính phạt chậm trả cho thanh toán trễ cũng như vẫn cho phép xuất hàng khi tổng công nợ + doanh thu lớn hơn tín dụng (tất nhiên là trong một phạm vi nào đó) lúc này các tham số phạt chậm trả bằng “No”, giao hàng có giá trị “Yes”. Một thời gian sau DN có thể thay đổi quy trình này bằng tham số phạt chậm trả bằng “Yes”, giao hàng có giá trị “No” hệ thống sẽ tự động tính phạt lãi suất chậm trả ứng với từng lần thanh toán chậm và khi khách hàng mua vượt quá tín dụng hệ thống sẽ bắt buộc phải phê duyệt lệnh xuất hàng này từ lãnh đạo.

Nói chung đây là một ví dụ về tham số và còn rất nhiều tham số khác

khongianit

Sunday, November 14, 2010

Reducing the Size of your Database in SQL Server 2005/SP2

An exciting new feature in SQL Server 2005/SP2 is Vardecimal Storage Format. This storage format lets you reduce the size of your table significantly if the table has one of more columns of type decimal or numeric without requiring any changes to your application.

Up until now, the decimal and numeric types are stored as fixed length data in SQL Server. Both of these types are functionally equivalent and have a format of (p, s) where p is the precision (number of decimal digits) and s is the scale representing number of digits after the decimal. Depending on the precision (it can be declared in the range from 1 to 38), the decimal value can take anywhere from 5 bytes to 17 bytes. This can bloat the size of the table, especially when you have small decimal values for a column declared with high precision requirement. This issue is similar to char (17) vs. varchar(17). In this case, if most of your character data is 1 or 2 characters long but the max value is 17 characters long, you can reduce the size of the table by declaring the column to be of type varchar(17) instead of char(17).

The new vardecimal storage format stores the decimal/numeric values in a variable length storage format. It provides efficient storage of decimal/numeric data by eliminating the leading/trailing zeros and only storing the minimum required bytes. Using this format, you can get significant space savings (depending on your data distribution) in the space required to store decimal/numeric data. You can enable vardecimal storage format at a table level.

In our in-house testing, we have seen significant reduction in the size of the FACT table(s) that has large number of decimal columns. FACT tables are typically the largest table in a Data Warehouse. Here are some the numbers from our testing.

Best case reduction in the size of the table

57%

69%

51%

In my next post http://blogs.msdn.com/sqlserverstorageengine/archive/2006/11/13/estimating-the-space-savings-with-vardecimal-storage-format.aspx , I will describe when and how to enable Vardecimal storage format on one or more tables in your database.

Thursday, October 7, 2010

Using Dynamics 'AX .NET Business Connector' to access Dynamics AX 4.0 from .NET world

So, this is a really interesting integration aspect between AX and .NET apps. We want to access AX business logic (or data, transactions, etc.) from the .NET world. :-)

Requirements

Before starting to develop anything, we need to install several required components:

In my case, I’ve got a single development machine where I have installed everything. I mean:

- SQL Server 2005

- Dynamics AX 4.0

- AX .NET Business Connector

- Visual Studio 2005 (for .NET development)

- We could also install ‘Windows SharePoint Services’ and the ‘AX Enterprise Portal’. It also uses .NET Business Connector for accessing AX, but in this case, we are just talking about .NET and AX. I’ll maybe post about ‘AX Enterprise Portal’ and Windows SharePoint Services in another posting. J

So!, the AX .NET Business Connector allows accessing Microsoft Dynamics AX from our own .NET applications as though they were a native Microsoft Dynamics AX client. So any .NET app or even ASP.NET web-app could access AX business components using this connector. For instance, as I already said, the ‘AX Enterprise Portal’ (based on Windows SharePoint Services and .NET) uses .NET Business Connector to access AX business logic.

BTW, internally, all these integration technologies interact with Dynamics AX through Application Object Server (AOS), which is kind of the ‘Business Components Application Tier’ within AX architecture itself.

AX .NET Business Connector installation and configuration

Before installing Business Connector, the following must be available in the domain:

- A core Microsoft Dynamics AX installation. This installation can be completed at the same time as the Business Connector installation, or it can be done prior to this installation.

- Active Directory configured in native mode.

By default, it uses Windows authentication security (AD), so it can be also integrated with AX Enterprise Portal (based on Windows SharePoint Services, which also uses Windows security). This security authentication type is important to have it into account when accessing from our own .NET apps.

We also need a Windows domain account to act as the Business Connector Proxy. So we need to configure the Business Connector if our application requires "act-on-behalf-of" functionality for external users or users that are at times unable to connect to our application.

So, for instance, I created an account within Windows Active Directory, called MyDomain\bcproxy. That account is going to be my ‘proxy account’.

Remember to assign a password to the user, select the Password does not expire option and select the No interactive logon rights option.

(Optional) Adding the proxy account to the IIS local Windows group.

For Web applications, we must add the Business Connector proxy account to the IIS local Windows group. If you are using Windows SharePoint Services, you must also add the account to the Windows SharePoint local Windows group.

1. Open the Computer Management application (Start > Administrative Tools > Computer Management).

2. Expand the Groups folder under Local Users and Groups.

3. Add the Business Connector proxy account to the following groups:

- IIS_WPG (IIS Worker Process Group)

- STS_WPG (STS Worker Process Group), if running Windows SharePoint Services

(Optional) Configure the IIS application pool

For Web applications, you must associate the Business Connector proxy account to the appropriate application pool identity.

Installation of ‘.NET Business Connector’ setup-app.

So now we are ready to install ‘.NET Business Connector’ from normal AX setup.exe DVD, but we have to select that we want to install it. ;-)

The setup’s steps and quite normal, almost just the ‘next, next’ stuff.

Configure the Business Connector Proxy User

The last step is to configure the Business Connector Proxy User within AX configuration:

1. Start Microsoft Dynamics AX (Start > All Programs > Microsoft Dynamics > Microsoft Dynamics AX 4.0 Client).

2. Open the Business Connector Proxy dialog box: Administration > Setup > Security > Business Connector Proxy.

3. In the Alias box, enter the alias. In the Network domain box, enter the domain of the user and then close the dialog box.

Implementing a sample AX class to consume it

So now we’re starting one of the fun tasks!!

We are going to implement a basic X++ class with a simple method. Just for testing.

So, within Dynamics AX client, open the AOT (Application Objects Tree):

Then, let’s create a new simple class, like the following:

So, I’ve created a very simple method called ‘Salute()’, which accepts a single string parameter (a name) and then it responds with a salutation. It is very simple, just a testing method for accessing AX from .NET world. J. Here is the Salute() method code:

X++ Code:

client server public static str Salute(str name)
{
str salute = "Cheers " + name + "! from AX!";
;
return salute;
}

Great!, very simple!. An if you are used to C# or C++, X++ it is quite similar!.

So now, we could test this method calling it from an AX JOB. But, we’re directly to execute it calling it from .NET (developing with Visual Studio 2005) through the ‘AX .NET Business Connector’.

Ok, I’ve created a simple WinForms application project called NetBcWinFormsTest. Take into account that this is just for testing. If it were a real application (.NET WinForms client as presentation layer), may be we’ll use a Web-Service or WCF-Service in between (for remote calls).

So, here we can see VS.2005 with our simple WinForms proyect, and a single Windows form with a button:

So now, we have to add a reference to the ‘AX .NET Business Connector’ .NET assembly, which is the ‘Microsoft.Dynamics.BusinessConnectorNet.dll’.

We have to add it using the ‘Add ReferenceàBrowse’ option, selecting the physical .dll situated on:

C:\Program Files\Microsoft Dynamics AX\40\Client\Bin\Microsoft.Dynamics.BusinessConnectorNet.dll

Ok, now we are ready for programming some C# code (or VB.Net code, of course).

Let’s double click on our simple button, and add the following code:

A ‘using’ sentence (just like a shortcut for our C# code):

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;


using Bcn = Microsoft.Dynamics.BusinessConnectorNet;

namespace NetBcWinFormsTest

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void btnAccessAX_Click(object sender, EventArgs e)

{

// Create a BCN object

Bcn.Axapta axp;

axp = new Bcn.Axapta();

try

{

// In this case there’s no need for credentials, it is taken from Winforms execution

// because this is just a sample testing application.

// but if it were an ASP.NET app, we should provide specific credentials.

axp.Logon(null, null, null, null);

}

catch (Exception excepn)

{

MessageBox.Show(excepn.ToString());

return;

}

//Calling the X++ static Method!!.

string salutation;

salutation = (string)axp.CallStaticClassMethod(

"CdltllDemoBcnClass", // The class name.

"Salute", // method's name.

"CESAR"); // Parameters.

MessageBox.Show(salutation);

axp.Logoff();

//

}

}

}

Take a look to the selected code and read all the C# comments within that code.

Note that we are instancing a standard BCN object using the class (Microsoft.Dynamics.BusinessConnectorNet.Axapta), and then, when calling the ‘CallStaticClassMethod() method, we have to provide all the X++ class and method information.

So!, the resulting execution in our .NET App is the following…:

Not a very impressive graphics interface, but we are getting that result from within Dynamics AX business logic!! J.

Next step is getting real data from AX tables and AX business classes.

Getting AX real Data (Updated - November 28th 2007)

So, now, we're going to add a new functionality to our little .NET program. In this case, we are going to invoke AX classes to get real AX data. For instance, we're going to get data about Vendors.

Then, we add another simple button to our .NET form, and also a DataGridView where we'll show that data. It would look like the following:

image

Then, we add the following code to be triggered from our second button:

A ‘using’ sentence (just like a shortcut for our C# code):

private void btnAxDataAccess_Click(object sender, EventArgs e)

{

// .NET Business Connector objects

Bcn.Axapta ax;

Bcn.AxaptaRecord axRecord;

// Name of table to query.

String strTable = "VendTable";

// VendTable field names for calls to AxRecord.get_field

String strVendAccountNumField = "AccountNum";

String strVendNameField = "Name";

// Output variables for calls to AxRecord.get_Field

Object vendAccNum, vendName;

// String used to query table.

String strQuery = "select * from %1";

//Sample including WHERE clause

//strQuery = "select * from %1 where %1.vendGroup == ' my_search_criteria_here '";

try

{

// Log on to Microsoft Dynamics AX.

ax = new Bcn.Axapta();

ax.Logon(null, null, null, null);

// Create an AxaptaRecord object for the VendTable.

axRecord = ax.CreateAxaptaRecord(strTable);

// Execute the query on the table.

axRecord.ExecuteStmt(strQuery);

// DataTable creation

DataTable dt = CreateVendorDataTable();

DataRow row;

// Loop through the set of retrieved records.

while (axRecord.Found)

{

// Retrieve the record data for the

// specified fields.

vendName = axRecord.get_Field(strVendNameField);

vendAccNum = axRecord.get_Field(strVendAccountNumField);

row = dt.NewRow();

row["Name"] = vendName.ToString();

row["AccNum"] = vendAccNum.ToString();

dt.Rows.Add(row);

// Advance to the next row.

axRecord.Next();

}

// Dispose of the AxaptaRecord object.

axRecord.Dispose();

// Log off from Microsoft Dynamics AX.

ax.Logoff();

//Data-Binding with our GRID

dataGridView1.DataSource = dt;

}

catch (Exception ex)

{

// Console.WriteLine("Error encountered: {0}", e.Message);

// Take other error action as needed.

}

}

// Create an ADO.NET DataTable ‘on the fly’

public DataTable CreateVendorDataTable()

{

DataTable dt = new DataTable();

dt = new DataTable();

DataColumn vendorNameColumn;

vendorNameColumn = new DataColumn("Name");

vendorNameColumn.DataType = Type.GetType("System.String");

dt.Columns.Add(vendorNameColumn);

DataColumn vendorAccNumColumn;

vendorAccNumColumn = new DataColumn("AccNum");

vendorAccNumColumn.DataType = Type.GetType("System.String");

dt.Columns.Add(vendorAccNumColumn);

return dt;

}

So, what we are doing is using the AxaptaRecord class to select and get all the records from AX data. Keep in mind one important thing. Unlike ADO.NET, which is connectionless oriented, AX data access classes are connection-oriented. I mean, once you have selected what you want, you have to loop over it in a connected environment. In this case, what I am doing is looping through all the records and creating an ADO.NET DataTable 'on the fly' (could be within a DataSet). After having a DataTable or DataSet we could return it to any other .NET assembly or, as in this case, we just make a DataBinding with our GridView, so we show all the records.

Or course, in a real Application and depending of data volume, we should filter data based on kind of 'data pages' or 'data windows', so we won't fill a single DataTable with all the AX table data.

So, if we execute it, we'll get all that AX data!.

image

Magic between .NET and Dynamics AX?. :-)

Sunday, September 26, 2010

reverse settlement account

when users using AP>> Journal >> Invoices>> Invoice Journal to make transaction, but when the they finished then then they miss settlement of Vendor. so that to solve this problem we do below: AP >> Vendor detail >>select Vendor ID then function button >> click close transaction editing >> select line need to reverse then click reverse button. % That all, khongianit

Thursday, September 9, 2010

How to Upload Opening Balance for Bank in Microsoft Dynamics AX 2009

This article provides you the steps to upload bank opening balance in Dynamics AX 2009.

Bank opening balance scenario:
------------------------------------

Normally, a bank has un-reconciled transactions at end of the any period. Hence, when a company needs to upload bank opening balance, all reconciled transactions balance is updated as one transaction and all un-reconciled transactions as individual entries.

For example, a company receives their bank statement dated 31st December and shows an ending credit balance of $100,950, of which $950 is the sum of un-reconciled transactions while $100,000 has been reconciled.

Section 1: Setup Journal, Bank and Ledger accounts for bank.
-----------

(NOTE: Follow this section only if Journal, bank, and ledger accounts are not created otherwise go to section 2)

  1. Go to General ledger  Setup  Journals  Journal names
  2. Setup a new journal.
  3. Go to General Ledger  Chart of accounts  setup new account code 111110 for ‘USDBANK’
  4. Go to General Ledger  Chart of accounts  setup new temporary account code 111111 for ‘USDBANK’
  5. Go to Bank  Bank accounts details and setup the bank ‘USDBANK’ with required details and link ledger account 111110 to bank.

Section 2: Enter reconciled balance for the bank.
-----------

Follow the steps below to update the reconciled balance.

  1. Go to General Ledger  Journals  General Journal  Create a new journal  Click the lines button.
  2. Enter values in following fields.
    2.1. Date = date for opening balance
    2.2. Account type = Bank
    2.3. Account no. = ‘USDBANK’
    2.4. Transaction text = appropriate text (‘Reconciled opening balance for the year 2009)
    2.5. Credit = 100,000
    2.6. Offset A/c type = ‘Ledger’
    2.7. Account no. = 111110 (Ledger a/c code for bank)

    Note: Step 2.7, ledger account for bank is selected to ensure that balance gets nullified in chart of accounts. So, when user enters the trial balance, user doesn’t need to worry about bank ledger accounts.

  3. Post the journal and check the bank balance via Bank  Bank details  Balance. It shows user balance as Credit 100,000.

Section 3: Enter un-reconciled transactions for the bank.
-----------

Follow the steps below to enter all un-reconciled transactions.

  1. Go to General Ledger  Journals  create a journal  click lines.
  2. Create a new line for each un-reconciled transaction with following fields.

2.1. Date = date for Opening balance (as an example 01-Jan-2009)
2.2. Account type = Bank
2.3. Account no. = ‘USDBANK’
2.4. Transaction text = ‘un-reconciled bank transactions as at 01-Jan-2009’ (as an example)
2.5. Debit amount = transaction amount.
2.6. Go to the payment tab, and enter values in following fields

2.6.1. Payment reference = document details
2.6.2. Bank transaction type = Cheque or deposit etc. from available types.

Use below table to simulate and get an opening balance as highlight above.

Account type

Account

Transaction text

Debit

Credit

Bank transaction type

Payment reference

Bank

USDBANK

un-reconciled bank transactions as at 01-Jan-2009

350

01

Doc 1

Bank

USDBANK

un-reconciled bank transactions as at 01-Jan-2009

1200

01

Doc 2

Bank

USDBANK

un-reconciled bank transactions as at 01-Jan-2009

150

01

Doc 3

Bank

USDBANK

un-reconciled bank transactions as at 01-Jan-2009

700

01

Doc 4

Bank

USDBANK

un-reconciled bank transactions as at 01-Jan-2009

1000

05

CHQ 1

Bank

USDBANK

un-reconciled bank transactions as at 01-Jan-2009

450

05

CHQ 2

Ledger

111111

Opening transactions balance

950

Section 4: Reconciled opening balance ‘reconciled’ transaction.
-----------

We have $100,000 entered as bank reconciled opening balance. Hence, we need to reconcile it. Follow the steps below to complete the process.

  1. Go to Bank  Bank Account details  Select USDBANK record Function  Account Reconciliation.
  2. Press CTRL + N to enter new bank statement.
  3. Enter ‘dummy’ statement as ‘OP Balance’, statement date as 01-Jan-2009 and ending balance as $100,000.
  4. Click ‘Transactions’ button.
  5. Mark the ‘Cleared’ check box for Opening balance’ transaction of $100,000.
  6. Click the button ‘Reconcile account’.

Upon completion, only those unreconciled open transaction will appear as un-reconciled transactions.

Section 5: Settle and close the temporary bank account.
-----------

  1. Go to General Ledger  Journals  create a journal  click lines.
  2. Create a line with following fields.
    • Date = date for Opening balance (as an example 01-Jan-2009)
    • Account type = Ledger
    • Account no. = ‘111110’
    • Transaction text = ‘Settle and close temporary bank account’
    • Debit amount = transaction amount. (In this case it is $950)
    • Offset a/c type= Ledger
    • Account no. = ‘111111’
  3. Post the Journal.
  4. Go to Chart of Account details screen and verify that 111110 and 111111 have zero balance.
  5. Select the account 111111 and go to ‘General’ tab and tick ‘Locked in Journal’. This is to avoid any further journal entries to this account.

Section 6: Verify all balances and bank transactions on posting of trial balance.
-----------

NOTE: It is assumed that trial balance has been entered.

  1. Go to General ledger  Chart of Account details and refer the ‘balance column or verify balance via ‘Balance’ button.
  2. Go to Bank  Bank Account details  Balance button and verify that balance is correct.
  3. Go to Bank  Reports  Transactions  Bank account statement and print the report and verify transactions.
  4. Go to Bank  Reports  Reconciliation  Un-reconciled bank transactions report and verify it is correct.
(Source Micorsoft Dynamics AX 2009)

Sunday, August 29, 2010

How to shrink SQL logs

Just want to inquire on how to shrink my sql logs.
My disk space is running and I suspect that sql logs is the cause
of the problem..
Answer:
BACKUP LOG WITH TRUNCATE_ONLY will empty your log file (depending on recovery model) , but if you then want to make the log file smaller, you will have to use DBCC SHRINKFILE

Vì sao tôi lại thất bại?

Trong quá trình xin việc, thất bại là một việc rất đỗi bình thường, đối với nhiều người thì việc đó xảy ra như cơm bữa. Khi gặp phải trường hợp như vậy, bạn sẽ làm gì: Buồn? Thất vọng? Hay là đi đến một nơi nào đó thật vắng vẻ để hét to lên, sau đó lấy lại tinh thần để đương đầu với các “cuộc chiến” mới? Nhưng cũng có bao giờ bạn lại tự đặt câu hỏi: “Vì sao tôi lại thất bại như thế?”


Dưới đây là một số lý do “rất vui” mà các nhà tuyển dụng có thể đánh trượt bạn ra khỏi “cuộc chiến” khốc liệt này.

1. Có tuyển tôi không thì bảo?


Có một công ty tuyển dụng với chính sách đãi ngộ rất cao. Các ứng viên đến phỏng vấn rất đông nhưng công ty vẫn chưa thấy ưng ý ứng viên nào. Bỗng nhiên trong đám đông một ứng viên nam hùng hổ tiến đến trước mặt các vị giám khảo tham gia tuyển dụng, đưa một con dao ra trước mặt và nói: “Nếu các ông các bà không tuyển dụng tôi thì tôi sẽ cứa tay luôn. Có tuyển tôi không thì bảo?". Nếu bạn là nhà tuyển dụng, bạn có tuyển những nhân viên “ưa hành động” như thế này không?


2. “Chùa nhỏ không chứa nổi Phật lớn”


Có hai người bạn cùng đi xin việc tại một công ty, nhưng kết cục cả hai đều thất bại. Người bạn thứ nhất hỏi chuyện người bạn thứ hai:


- Thế nhà tuyển dụng nói gì với anh?


- Sau khi tôi trình bày về sở trường của mình, họ rất hoan nghênh và bảo với tôi là tuy có rất nhiều sở trường nhưng không có cái nào áp dụng được trong công việc cả.Thế còn anh? Kết cục không đáng buồn như tôi chứ?


- Cũng giống nhau cả thôi. Sau khi nghe trình bày về kế hoạch vĩ mô của tôi nếu trở thành nhân viên của công ty thì họ nói rằng: “Ý kiến của anh rất hay, nhưng chúng tôi chỉ là công ty nhỏ, sợ rằng: Chùa nhỏ không chứa nổi Phật lớn”.


3. Đó là lựa chọn sáng suốt nhất của cả hai bên


Trong một cuộc phỏng vấn ứng viên tại một công ty thương mại khá uy tín, sau khi nghe ứng viên A trình bày đôi nét về bản thân và kế hoạch cho tương lai nếu được nhận vào công ty, vị giám đốc đã lắc đầu tỏ ý không hài lòng. Câu hỏi cuối cung được ông đưa ra là: “Nếu chúng tôi giao cả công ty vào tay bạn thì chúng tôi có thể yên tâm được hay không?”. Ứng viên không cần suy nghĩ mà trả lời luôn: “Không có gì là không yên tâm cả, vì đó là lựa chọn sáng suốt nhất của cả hai bên.” Đương nhiên thất bại đã không “vuột khỏi tầm tay” của ứng viên này.


4. Sợ không giữ nổi


Tôi có một người bạn gái học rất thân thiết, từ hồi học phổ thông cho tới khi lên đại học cô ấy luôn là một gương mặt xuất sắc trong học tập. Khi ra trường với tấm bằng đỏ trên tay, tưởng chừng một công việc ổn định, lương cao không phải là một việc quá khó khăn, nhưng ngay tại công ty đầu tiên, cô đã bị từ chối.


Mọi người đều lấy làm ngạc nhiên không hiểu sao một người xuất sắc như cô lại bị trượt sau cuộc phỏng vấn đó. Đến khi cô trực tiếp đem thắc mắc của mình hỏi công ty thì câu trả lời nhận được là: “Bởi vì cô quá xuất sắc, chúng tôi sợ sẽ không giữ nổi cô trụ lại công ty. Do đó, tốt nhất là không nên tuyển để đỡ mất thời gian đào tạo...”


5. Ông chủ


Có một nhân viên tham dự một cuộc phỏng vấn tại một công ty lớn. Trông anh rất căng thẳng khi trực tiếp đối diện với các nhà tuyển dụng nên câu hỏi duy nhất được đặt ra: “Anh hãy kể một câu chuyện cười”. Nghĩ mãi mới nhớ ra được một câu chuyện, anh ta hào hứng kế: “Một nhà sưu tập vẹt đi vào trong một nơi chuyên bán chim cảnh để tìm mua những con vẹt ưng ý. Người bán hàng giới thiệu cho anh ta rất nhiều các loại vẹt khác nhau đến từ khắp nơi trên thế giới, cuối cùng anh ta cũng chọn được 3 con ưng ý nhất, một con màu xanh, một con màu vàng và một con màu đỏ. Chủ hàng giới thiệu:


- Con màu xanh biết nói 4 thứ tiếng, tôi bán 100 đồng tiền vàng, con màu vàng biết nói 6 thứ tiếng , tôi bán 300 đồng tiền vàng, còn con màu đỏ chả biết nói thứ tiếng nào, tôi bán 500 đồng tiền vàng.


Người sưu tầm vẹt cảm thấy rất lạ lùng bèn hỏi:


- Con màu đỏ không biết nói thứ tiếng nào thì sao giá của nó lại đắt như vậy, ông có nhầm không đấy?


Chủ hàng thanh minh:


- Tôi cũng không biết được, thấy mấy con còn lại đều gọi nó là “ông chủ” nên giá phải tăng lên thôi.”


Sau khi kể xong câu chuyện, mặt anh chàng này tái nhợt lại, và anh ta đã biết ngay kết quả sau khi câu chuyện kết thúc.


Hải Hiền
(theo Xinhuanet.com)